У меня есть метод в классе, ConsoleHandler
, экземпляр которого я шпионил:Mockito - настроить макет так будет вызывать метод с закачиваемым параметром
setIndexManager(IndexManager im);
Я хочу сказать " когда вы вызываете этот метод, вызывайте его не с параметром, с которым вы хотите его вызвать, а вместо этого с таким-то параметром »(а именно, макетным объектом).
Я попытался сделать это:
doAnswer(new Answer<Void>(){
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
((ConsoleHandler)invocation.getMock()).setIndexManager(newMockIM);
return null;
}}).when(spyCH).setIndexManager(any(IndexManager.class));
... к сожалению, это вызвало бесконечный цикл ...
Тогда я подумал: хорошо, если вы можете указать в пункте when
, что любой IndexManager parameter
должен вызвать это, кроме для mockIM
, может быть, вы можете остановить эту бесконечную рекурсию:
doAnswer(new Answer<Void>(){
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
((ConsoleHandler)invocation.getMock()).setIndexManager(newMockIM);
return null;
}}).when(spyCH).setIndexManager(not(newMockIM));
... но not
не работает, как это ...
Есть ли способ сделать это? Я довольно внимательно изучил возможные похожие вопросы, которые возникли, но ничего не мог найти.
Отлично, спасибо ... как вы можете видеть, что эта мысль произошла (как часто) сразу после публикации. Но я гарантирую, что мне понадобилось бы хотя бы час, чтобы понять, как это сделать! –
Только одна небольшая проблема: я получаю предупреждение типа «Матчи, устаревшие». Это Mockito 2.4.1: мы, по-видимому, должны использовать 'ArgumentMatchers' вместо этого ... –
Хорошо, справедливо. Я не очень хорошо справлялся со всеми в новых версиях Mockito. Я не понимаю, почему команда модифицирует и осуждает столько вещей, сколько они есть, и я не понимаю мотивацию некоторых из последних изменений, которые они внесли в более поздние версии. Я надеюсь, что имена методов одинаковы в новых 'ArgumentMatchers'. –