У меня есть ситуация, когда это выглядит как вызов when (). ThenReturn () вызывает исключение, которое было определено в операторе when (). Then ().
Этот тест проходит:
@Test()
public void myTest() {
List<String> list = mock(List.class);
when(list.contains(any(String.class))).thenReturn(false);
when(list.contains("A")).thenReturn(true);
when(list.get(any(Integer.class))).then(new Answer(){
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
return invocation.getArguments()[0].toString();
}
});
when(list.get(0)).thenReturn("A");
assertTrue(list.contains("A"));
assertFalse(list.contains("B"));
assertEquals("A", list.get(0));
assertEquals("1", list.get(1));
}
Этот тест выдает исключение MyException (с сообщением «0 выходит за границы массива») в последней строке:
@Test()
public void myTest2() {
List<String> list = mock(List.class);
when(list.contains(any(String.class))).thenReturn(false);
when(list.contains("A")).thenReturn(true);
when(list.get(any(Integer.class))).then(new Answer(){
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
throw new MyException((int)invocation.getArguments()[0]);
}
});
when(list.get(0)).thenReturn("A");
}
class MyException extends RuntimeException{
public MyException(int i){
super(i + " is outside array bounds");
}
}
Я обошел эту проблему, поместив всю логику в оператор when (). Then (), но задавался вопросом, является ли это ожидаемым поведением?
Моя зависимость:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.10.19</version>
</dependency>
Edit:
Такое поведение объясняется ссылкой @second в комментариях.
Как Mockito обрабатывает перекрывающиеся совпадения с несколькими аргументами в блоке thenReturn