我对Mockito仍然有些困难。我想为两个不同的对象示例提供两个测试用例。所以我想根据参数值模拟不同的方法行为。
问题在于,当我运行test()
方法时,help
valiable的返回值为“b”,并且断言不返回true。如果我评论标记为(***)
的行,一切正常。
正如您所看到的,我尝试使用thenAnswer
代替thenReturn
,但结果是一样的。
public class TestItAll {
TestClass test;
HelpClass a ;
HelpClass b;
@Before
public void init(){
a = new HelpClass("a");
b = new HelpClass("b");
Mockito.when(test.getHelp(a)).thenReturn("a");
/*Mockito.when(test.getHelp(a)).thenAnswer(
new Answer< String>() {
public String answer(InvocationOnMock invocation) {
return "a";
}
}); */
Mockito.when(test.getHelp(b)).thenReturn("b");//(***)
/*Mockito.when(test.getHelp(b)).thenAnswer(
new Answer< String>() {
public String answer(InvocationOnMock invocation) {
return "b";
}
}); */
}
@Test
public void testA(){
String help= test.getHelp(a);
Assert.assertEquals(help, "a");
}
/*@Test
public void testB(){
String help= test.getHelp(b);
Assert.assertEquals(help, "b");
}*/
}
请不要问我为什么要嘲笑测试对象。这只是一个更复杂情况的典范。
答案 0 :(得分:2)
首先,我假设您的声明TestClass test;
实际上是TestClass test = mock(TestClass.class);
,否则@Before
方法会抛出NullPointerException
。
使用when(test.getHelp(a))
时,mockito将使用a
的{{1}}方法检查参数是否匹配。如果是equals
方法始终返回equals
,它将无法与true
区分a
。我已经使用重写b
方法运行您的代码(即equals
个对象只有在它们是同一个实例时才相等)并且两个测试都已通过。
您可能希望使用参数匹配器 - HelpClass
不依赖于when(test.getHelp(argThat(sameInstance(a))))
方法。如果您需要比equals
更复杂的内容,我建议shazamcrest使用sameInstance
匹配器。