Один из самых распространенных вопросов, возникающих при работе с Mockito, — как замокировать методы с возвращаемым типом void. Это может быть требуемо во многих ситуациях, особенно при использовании паттерна Observer, где методы часто не возвращают значения.
Допустим, есть класс World
, который содержит метод addListener
, добавляющий слушателей, и метод doAction
, который выполняет некоторое действие и обновляет состояние системы.
public class World { List<Listener> listeners; void addListener(Listener item) { listeners.add(item); } void doAction(Action goal,Object obj) { setState("i received"); goal.doAction(obj); setState("i finished"); } private String state; //setter getter state }
И есть тестовый класс WorldTest
, который пытается замокировать World
и добавить себя в качестве слушателя.
public class WorldTest implements Listener { @Test public void word{ World w= mock(World.class); w.addListener(this); ... ... } }
Здесь возникает проблема: система не реагирует на добавление мока.
В Mockito есть инструменты для решения этой проблемы. Вместо того чтобы вызывать метод addListener
напрямую, можно использовать конструкцию doNothing().when()
.
doNothing().when(mockedObject).voidMethod();
В данном случае, это будет выглядеть так:
doNothing().when(w).addListener(this);
После этого, можно вызвать addListener
без проблем. Вызов doNothing().when()
гарантирует, что ничего не будет сделано при вызове метода. Это идеально подходит для методов с void возвратом, так как они, по определению, ничего не возвращают.
Важно помнить, что Mockito не может замокировать методы, которые являются финальными или статическими. В таких ситуациях следует пересмотреть дизайн кода или использовать другой инструмент для мокирования.
В заключение, хотелось бы отметить, что использование Mockito может значительно упростить процесс тестирования и сделать его более предсказуемым.
Добавить комментарий