如何写出一个不等于某物的匹配符



我正在尝试为一个调用创建一个mock。假设我有这个方法,我正试图摆脱:

class ClassA {
  public String getString(String a) {
    return a + "hey";
  }
}

我试图模拟的是:第一个实例是

when(classA.getString(eq("a")).thenReturn(...);`

在相同的测试用例中

when(classA.getString([anything that is not a])).thenReturn(somethingelse);

第二种情况是我的问题:如何匹配除"a"之外的anyString()

使用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");

希望能有所帮助。

argThat与Hamcrest:一起使用

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

您也可以通过订购来完成此操作。如果按正确的顺序放置一个when(anyString)when(eq("a")),Mockito应该按顺序测试它们,并在适当的时候执行"a"逻辑,否则执行"anyString"逻辑。

在mockito中,最后一次存根是最重要的。这意味着你可以简单地使用标准的匹配器来满足你的需求:

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

请注意,必须对两者使用ArgumentMatchers,因为您将它们混合在一起。

在仔细查看了建议的答案后,我实际上采取了这种方法:

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

这使我可以通过调整params的返回基数来处理两种以上的情况。

最新更新