Я хочу заглушить класс репозитория, чтобы протестировать другой класс (класс держателя), у которого есть репозиторий. Интерфейс репозитория поддерживает операции CRUD и имеет много методов, но мой модульный тест для класса Holder должен вызывать только два из них. Интерфейс репозитория:
public interface IRepo {
public void remove(String... sarr);
public void add(String... sarr);
//Lots of other methods I don't need now
}
Я хочу создать макет репозитория, который может хранить экземпляры, определять логику только для add
и remove
, а также предоставлять средства проверки того, что в нем хранится после вызова добавления и удаления.
If I do:
IRepo repoMock = mock(IRepo.class);
Затем у меня есть тупой объект, который ничего не делает для каждого метода. Все в порядке, теперь мне просто нужно определить поведение для добавления и удаления.
Я мог бы создать Set<String>
и заглушить только эти два метода для работы с набором. Затем я бы создал экземпляр держателя, у которого есть IRepo, внедрил частично заглушенный макет и после тренировки держателя проверил набор, чтобы убедиться, что он содержит то, что должен.
Мне удалось частично заглушить метод void, такой как remove
, с помощью устаревшего метода stubVoid
:
Set<String> mySet = new HashSet<>();
stubVoid(repoMock).toAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
Object[] args = invocation.getArguments();
String[] stringsToDelete = (String[]) args[0];
mySet.removeAll(Arrays.asList(stringsToDelete));
return null;
}
}).on().remove(Matchers.<String>anyVararg());
Но устарел, и это не намного лучше, чем создание частичной реализации для IRepo. Есть ли способ лучше?
ПРИМЕЧАНИЕ. Пожалуйста, ответьте только на Java 7, это должно работать на Android.