Подтвердить что ты не робот

Как написать совпадение, не равное чему-то

Я пытаюсь создать макет для вызова. Скажем, у меня есть этот метод, который я пытаюсь заглушить:

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"?

4b9b3361

Ответ 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());

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