Как смоделировать методы с возвращаемым типом void?
Я реализовал шаблон наблюдателя, но я не могу высмеять его с помощью Mockito, потому что я не знаю как.
И я попытался найти пример в Интернете, но безуспешно.
Мой класс выглядит так:
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
}
public class WorldTest implements Listener {
@Test public void word{
World w= mock(World.class);
w.addListener(this);
...
...
}
}
interface Listener {
void doAction();
}
Система не запускается с макетом.
Я хочу показать вышеупомянутое состояние системы. И делать заявления в соответствии с ними.
Ответы:
Взгляните на документы Mockito API . Поскольку связанный документ упоминает (пункт # 12) , вы можете использовать любого из
doThrow()
,doAnswer()
,doNothing()
,doReturn()
семейства методов из рамок Mockito издеваться недействительными методами.Например,
или если вы хотите объединить это с последующим поведением,
Предполагая, что вы смотрите на издевательство над сеттером
setState(String s)
в классе World ниже, код используетdoAnswer
метод для имитацииsetState
.источник
setRate()
естьfinal
, и поэтому не может быть осмеяно. Вместо этого попробуйтеcreate()
- экземпляр, который делает то, что вам нужно. Там не должно быть необходимости издеватьсяRateLimiter
.Я думаю, что нашел более простой ответ на этот вопрос: вызвать реальный метод только для одного метода (даже если он имеет возврат void), вы можете сделать это:
Или вы можете вызвать реальный метод для всех методов этого класса, выполнив это:
источник
В дополнение к тому, что сказал @sateesh, когда вы просто хотите смоделировать метод void, чтобы тест не вызывал его, вы можете использовать
Spy
этот способ:Если вы хотите запустить тест, убедитесь, что вы вызываете тестируемый метод для
spy
объекта, а не дляworld
объекта. Например:источник
Решением так называемой проблемы является использование
spy
Mockito.spy (...) вместоmock
Mockito.mock (..) .Шпион позволяет нам частичное издевательство. Мокито хорош в этом вопросе. Поскольку у вас есть класс, который не завершен, таким образом, вы издеваетесь над необходимым местом в этом классе.
источник
Прежде всего: вы всегда должны импортировать mockito static, таким образом код будет намного более читабельным (и интуитивно понятным):
Для частичной насмешки и при сохранении оригинальной функциональности в остальном мокито предлагает «Шпион».
Вы можете использовать его следующим образом:
Чтобы исключить выполнение метода, вы можете использовать что-то вроде этого:
чтобы придать некоторое поведение методу, используйте «when» с «thenReturn»:
Для большего количества примеров, пожалуйста, найдите превосходные образцы mockito в документе.
источник
Как смоделировать пустые методы с помощью mockito - есть два варианта:
doAnswer
- Если мы хотим, чтобы наш метод mocked void что-то делал (смоделируйте поведение, несмотря на то, что void).doThrow
- Тогда есть,Mockito.doThrow()
если вы хотите выбросить исключение из метода mocked void.Ниже приведен пример того, как его использовать (не идеальный вариант использования, а просто хотел проиллюстрировать основное использование).
Вы можете найти более подробную информацию о том , как издеваются и проверить недействительные методы с Mockito в моем посте Как поиздеваться с Mockito (Всестороннее руководство с примерами)
источник
Добавление еще одного ответа в группу (не каламбур) ...
Вам нужно вызвать метод doAnswer, если вы не можете \ не хотите использовать шпионы. Тем не менее, вам не обязательно бросать свой собственный ответ . Есть несколько реализаций по умолчанию. В частности, CallsRealMethods .
На практике это выглядит примерно так:
Или:
источник
В Java 8 это можно сделать немного чище, если у вас есть статический импорт для
org.mockito.Mockito.doAnswer
:return null;
важно, и без этого компиляция не удастся с некоторыми довольно неясными ошибками, поскольку она не сможет найти подходящее переопределение дляdoAnswer
.Например,
ExecutorService
тот, который просто немедленно выполняет любойRunnable
передаваемый объект ,execute()
может быть реализован с использованием:источник
Я думаю, что ваши проблемы связаны с вашей тестовой структурой. Мне было трудно смешивать макеты с традиционным методом реализации интерфейсов в тестовом классе (как вы сделали здесь).
Если вы реализуете слушателя как Mock, вы можете проверить взаимодействие.
Это должно убедить вас, что «Мир» поступает правильно.
источник
Использование Mockito.doThrow как в:
Вы можете попробовать этот хороший пример:
Источник: http://apisonar.com/java-examples/org.mockito.Mockito.doThrow.html#Example-19
источник