我正在尝试为通话创建模拟。 假设我有这种方法我试图删除:
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()
?
答案 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());
这使我可以通过调整参数上的返回基数来处理两种以上的情况。