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

我正在尝试为通话创建一个模拟器。 说我有这个方法我试图删除:

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

anyString()情况是我的问题:我如何匹配除“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"); 

希望能帮助到你。

使用带Hamcrest的argThat

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

这允许我通过调整参数的返回基数来处理不止两个案例。