【发布时间】:2011-05-13 20:44:17
【问题描述】:
我对 Mockito 有疑问。
有没有可能做这样的事情:
ClassX x = mock(ClassX.class)
when(x.methodB()).thenReturn("toto");
String result = x.methodA();
我正在使用 Mockito 1.7。
我看到有一个“间谍”系统,但他们说不建议在我们测试的项目上使用它(为什么?)...
我还是尝试了那个间谍功能,但我得到了一个奇怪的行为。
检查我想做什么:
真实代码:
String methodA(String arg) {
return this.methodB(arg);
}
String methodB(String arg) {
return "toto";
}
测试代码:
@Test
public void testTest() {
final ClassX x = spy( new ClassX() );
final String argument = "arg";
doReturn("good").when(helper).methodB(argument);
assertTrue( x.methodB(argument).equals("good") );
assertTrue( x.methodA(argument).equals("good") );
}
正如他们所说,我避免了可能对间谍造成问题的 when thenReturn 语法(但无论如何它也不起作用)
奇怪的是: assertTrue(x.methodB(argument).equals("good")); 没问题
只有第二个 assertTrue(x.methodA(argument).equals("good")); 不行
实际上 helper.methodA(argument) 返回 "toto" -> 真实结果而不是模拟结果
在这种情况下,不可能告诉 mockito 返回“好”???好像测试类调用methodB的时候没问题,但是如果spy的方法调用methodB就不行了……
我不知道该怎么办...对同一个类的 2 个方法进行单元测试并让测试彼此独立以使著名的模拟测试框架无法实现是不是很奇怪?这个基本功能?这不就是我们所说的真正的单元测试吗?不明白为什么他们说要避免对被测对象使用 spy 方法...
谢谢
【问题讨论】:
-
刚刚在 Mockito 1.9.5 上尝试过,都返回了
"good"。所以我猜这种行为已经消失了。
标签: java unit-testing mocking mockito partial-mocks