我对 Mockito 有疑问。
有没有可能做这样的事情:
ClassX x = mock(ClassX.class)
when(x.methodB()).thenReturn("toto");
String result = x.methodA();
我正在使用 Mockito 1.7。
我看到有一个“ spy ”系统,但他们说不建议在我们测试的项目上使用它(为什么?)...
无论如何我都尝试了那个 spy 功能,但我得到了一个奇怪的行为。
检查我想做什么:
真实代码:
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 语法,这可能是 spy 的问题(但无论如何它都不起作用)
奇怪的是: assertTrue( x.methodB(argument).equals("good") ); 可以的
只有第二个 assertTrue( x.methodA(argument).equals("good") ); 不行
实际上 helper.methodA(argument) 返回“toto” -> 真实结果而不是模拟结果
在这种情况下不可能告诉 mockito 返回“好”???测试类调用methodB好像没问题,但是如果spy的一个方法调用methodB就不行了...
我不知道该怎么办...对同一类的 2 个方法进行单元测试并使测试彼此独立以至于一个著名的模拟测试框架没有实现是不是很奇怪这个基本功能?这不就是我们所说的真正的单元测试吗?不明白为什么他们说要避免在测试对象上使用 spy 方法...
谢谢
最佳答案
更新: 我写了下面的东西,然后片刻之后发现了 .thenCallRealMethod() ,它可以让你有效地执行部分 stub 。 Mockito 作者建议您使用重构将依赖项分离到不同的类中;但它们确实提供了部分 stub 的方法。我添加了一个测试方法来演示这种方法,并留下我的原始评论。
原创: 我真的很喜欢 Mockito,但这是 EasyMock 胜出的地方。我有两个不涉及 Mockito 的解决方案。第一个是覆盖测试实例上的 methodB。另一种是使用 EasyMock 进行部分模拟:
import org.junit.Test;
import static org.junit.Assert.*;
import static org.easymock.EasyMock.*;
public class PartialMockTest {
class ClassX {
String methodA(String arg) {return methodB(arg);}
String methodB(String arg) {return "toto";}
}
@Test
public void MockitoOnClassX(){
ClassX classx = mock(ClassX.class);
when(classx.methodB("hiyas")).thenReturn("tomtom");
when(classx.methodA(anyString())).thenCallRealMethod();
String response = classx.methodA("hiyas");
assertEquals("tomtom",response);
}
@Test
public void OverrideOnClassX() {
ClassX classx = new ClassX(){@Override String methodB(String arg){return "tomtom";}};
String response = classx.methodA("hiyas");
assertEquals("tomtom",response);
}
@Test
public void PartialMockOnClassX() throws NoSuchMethodException {
ClassX classx = createMockBuilder(ClassX.class).addMockedMethod("methodB").createMock();
expect(classx.methodA("hiyas")).andReturn("tomtom");
replay(classx);
String response = classx.methodA("hiyas");
assertEquals("tomtom",response);
}
}
关于java - 使用 mockito 进行单元测试(部分模拟),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4246088/