我对Mockito仍然有一些困难。我想为两个不同的对象示例提供两个测试用例。因此,我想根据参数值模拟不同的方法行为。
问题是,当我运行test()
方法时,help
validable的返回值是"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");
}*/
}
请不要问我为什么嘲笑一个测试对象。这只是一个更复杂情况的典型例子。
首先,我假设您的声明TestClass test;
实际上是TestClass test = mock(TestClass.class);
,否则@Before
方法抛出NullPointerException
。
当使用when(test.getHelp(a))
时,mockito将使用a
的equals
方法来检查参数是否匹配。例如,如果equals
方法总是返回true
,则它将无法区分a
和b
。我已经用重写equals
方法运行了您的代码(即,只有当HelpClass
对象是同一实例时,它们才相等),并且两个测试都通过了。
您可能希望使用参数匹配器-when(test.getHelp(argThat(sameInstance(a))))
来不依赖于您的equals
方法。如果你需要比sameInstance
更复杂的东西,我推荐来自shazamcrest的sameBeanAs
匹配器。