2017-01-29 7 views
0

У меня есть метод в классе, 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 не работает, как это ...

Есть ли способ сделать это? Я довольно внимательно изучил возможные похожие вопросы, которые возникли, но ничего не мог найти.

ответ

2

Конечно. Измените свою ступеньку так, чтобы она срабатывала только в том случае, если предоставленный аргумент не является вашим макетом.

Так последняя строка будет

}}).when(spyCH).setIndexManager(AdditionalMatchers.not(ArgumentMatchers.eq(newMockIM))); 

Тогда вызов внутри Answer не будет повторно инициировать вызов погасил.

Примечание

Я ответил, прежде чем вы добавили вторую половину вашего вопроса, но я считаю, что это нормально. Аргумент для not должен быть совпадением, но вы предоставили значение. Итак, все, что вам не хватало, - это eq.

+0

Отлично, спасибо ... как вы можете видеть, что эта мысль произошла (как часто) сразу после публикации. Но я гарантирую, что мне понадобилось бы хотя бы час, чтобы понять, как это сделать! –

+0

Только одна небольшая проблема: я получаю предупреждение типа «Матчи, устаревшие». Это Mockito 2.4.1: мы, по-видимому, должны использовать 'ArgumentMatchers' вместо этого ... –

+0

Хорошо, справедливо. Я не очень хорошо справлялся со всеми в новых версиях Mockito. Я не понимаю, почему команда модифицирует и осуждает столько вещей, сколько они есть, и я не понимаю мотивацию некоторых из последних изменений, которые они внесли в более поздние версии. Я надеюсь, что имена методов одинаковы в новых 'ArgumentMatchers'. –

Смежные вопросы