How to write a matcher that is not equal to something

試著忘記壹切 提交于 2019-11-27 23:24:52

With Mockito framework, you can use 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");

Hope it helps.

Use argThat with Hamcrest:

when(classA.getString(argThat(CoreMatchers.not(CoreMatchers.equalTo("a")))...

You might also be able to do this via ordering. If you put one when(anyString) and when(eq("a")) in the correct order, Mockito should test them in order and do the "a" logic when appropriate and then "anyString" logic otherwise.

In mockito the last stubbing is the most important. This means that you can simply use the standard matchers for your needs:

// "Default" return values.
when(classA.getString(ArgumentMatchers.anyString())).thenReturn(somethingelse);
// Specific return value for "a"
when(classA.getString(ArgumentMatchers.eq("a"))).thenReturn(something);

Note that you have to use ArgumentMatchers for both since you're mixing them.

I actually took this approach after carefully looking at the suggested answers:

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());

This allows me to handle more than just two cases by adjusting the return base on the params.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!