Я тренируюсь с mockito, но я немного застрял в том, как тестировать метод, зависящий от вызова метода в локальном объекте. См. Следующий пример:
public class Worker {
public void work() {
Vodka vodka = new Vodka();
vodka.drink();
}
}
Этот рабочий, вместо того, чтобы выполнять свою работу, любит пить. Но я хочу добавить тест, чтобы доказать, что он пьет, пока он работает. Но нет способа сделать это, потому что я должен проверить, что метод drink() вызывается при вызове метода. Я думаю, вы согласны со мной, что это невозможно проверить, поэтому мне нужно сломать зависимость, прежде чем начинать тестирование. Вот мое первое сомнение, как вы думаете, лучший способ нарушить такую зависимость? Если я просто изменю область действия водки на глобальную, я думаю, это будет нехорошо (я не хочу раскрывать ее другим частям класса). Я думал о создании factory, примерно так:
public class Worker {
private VodkaFactory vodkaFactory = new VodkaFactory();
public void work() {
Vodka vodka = vodkaFactory.getVodka();
vodka.drink();
}
}
Я не уверен, правильно ли нарушил зависимость, но то, что я хочу сделать сейчас, является тестом, который вызывается методом drink(), когда выполняется работа(). Я пробовал это без везения:
@Test
public void
does_the_worker_drink_while_working
() {
VodkaFactory vodkaFactory = mock(VodkaFactory.class);
Vodka vodka = mock(Vodka.class);
Worker worker = new Worker();
worker.work();
when(vodkaFactory.getVodka()).thenReturn(vodka);
verify(vodka,times(1)).drink();
}
Я высмеиваю factory, и когда будет обнаружено, что новый объект Vodka создается factory. Но затем, когда я решил проверить, что этот метод вызывает 1 раз метод drink(), mockito сообщает мне:
Wanted but not invoked:
vodka.drink();
-> at testing_void_methods_from_local_objects.WorkerSpecification.does_the_worker_drink_while_working(WorkerSpecification.java:22)
Actually, there were zero interactions with this mock.
Я не исправляю, или я делаю что-то неправильно. Не могли бы вы дать мне руку, завершающую этот тест, а также уточнить, что было бы лучшим способом тестирования таких непроверенных методов?
Я знаю, что у mockito есть метод, называемый doAnswer(), который используется для издевательства вызова метода, как вы думаете, он может быть полезен в этом случае? Как его использовать?
UPDATE:
Я следую советам, чтобы вызвать when()
до work()
, а также я пытаюсь разрешить factory устанавливать извне класса:
@Test
public void
does_the_worker_drink_while_working
() {
VodkaFactory vodkaFactory = mock(VodkaFactory.class);
Vodka vodka = mock(Vodka.class);
Worker worker = new Worker();
when(vodkaFactory.getVodka()).thenReturn(vodka);
worker.work();
verify(vodka,times(1)).drink();
}
Теперь это производственный код:
public class Worker {
private VodkaFactory vodkaFactory;
public void work() {
Vodka vodka = vodkaFactory.getVodka();
vodka.drink();
}
public void setVodkaFactory(VodkaFactory vodkaFactory) {
this.vodkaFactory = vodkaFactory;
}
Исключением, которое я получаю, является следующее:
java.lang.NullPointerException
at testing_void_methods_called_from_local_objects.Worker.work(Worker.java:9)
Это строка, которая говорит vodka.drink()
Извините, я все еще запутался в чем проблема.