我在使用 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");
}*/
}
请不要问我为什么要 mock 测试对象。这只是更复杂情况的一个模型示例。
最佳答案
首先,我假设您的声明 TestClass test;
实际上是 TestClass test = mock(TestClass.class);
,否则 @Before
code> 方法抛出 NullPointerException
。
当使用when(test.getHelp(a))
时,mockito会使用a
的equals
方法来检查参数是否匹配。如果例如equals
方法始终返回 true
,它无法区分 a
和 b
。我已经使用覆盖 equals
方法运行您的代码(即 HelpClass
对象仅当它们是同一实例时才相等)并且两个测试都已通过。
您可能需要使用参数匹配器 - when(test.getHelp(argThat(sameInstance(a))))
来不依赖您的 equals
方法。如果您需要比 sameInstance
更复杂的东西,我会推荐 shazamcrest 中的 sameBeanAs
匹配器。 .
关于java - 模拟具有不同值的一种方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29256358/