我正在尝试为一个调用创建一个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的返回基数来处理两种以上的情况。