如何编写一个不等于某事的匹配器

时间:2014-09-26 19:37:13

标签: java junit mockito matcher

我正在尝试为通话创建模拟。 假设我有这种方法我试图删除:

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

4 个答案:

答案 0 :(得分:77)

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

希望它有所帮助。

答案 1 :(得分:8)

argThat与Hamcrest一起使用:

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

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

答案 2 :(得分:1)

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

yarn add -g ionic@v3.0.1

请注意,由于您要混合使用二者,因此必须使用ArgumentMatchers。

答案 3 :(得分:0)

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

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

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