Как написать совпадение, не равное чему-то
Я пытаюсь создать макет для вызова.
Скажем, у меня есть этот метод, который я пытаюсь заглушить:
class ClassA {
public String getString(String a) {
return a + "hey";
}
}
То, что я пытаюсь высмеять, это:
1-й экземпляр
when(classA.getString(eq("a")).thenReturn(...);`
в том же тестовом случае
when(classA.getString([anything that is not a])).thenReturn(somethingelse);
Второй случай - мой вопрос: как мне сопоставить anyString()
, отличный от "a"?
Ответы
Ответ 1
С рамкой Mockito
вы можете использовать AdditionalMatchers
ClassA classA = Mockito.mock(ClassA.class);
Mockito.when(classA.getString(Matchers.eq("a"))).thenReturn("something");
Mockito.when(classA.getString(AdditionalMatchers.not(Matchers.eq("a")))).thenReturn("something else");
Надеюсь, что это поможет.
Ответ 2
Используйте argThat
с помощью Hamcrest:
when(classA.getString(argThat(CoreMatchers.not(CoreMatchers.equalTo("a")))...
Вы также можете сделать это с помощью заказа. Если вы поместите один when(anyString)
и when(eq("a"))
в правильном порядке, Mockito должен проверить их по порядку и выполнить логику "a", когда это необходимо, а затем логику "anyString" в противном случае.
Ответ 3
Я действительно использовал этот подход после тщательного изучения предложенных ответов:
doAnswer(new Answer<String>() {
public String answer(InvocationOnMock invocation) throws Throwable {
String originalParam = (String) invocation.getArguments()[0];
return StringUtils.equalsIgnoreCase(originalParam, "a") ? "Something" : "Something Else";
}
}).when(classA).getString(anyString());
Это позволяет мне обрабатывать не только два случая, регулируя базу возврата на параметры.