如何编写一个与某事不相等的匹配器
我正在尝试为通话创建一个模拟器。 说我有这个方法我试图删除:
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());
这允许我通过调整参数的返回基数来处理不止两个案例。