我是Mockito的新手,我需要使用类ClassToTest1
的部分模拟并调用实际方法somethingToTestVoid
。但问题是这个方法调用另一个方法doSomething
,抛出一个异常,我只需要为它创建一个存根。
public class ClassToTest1 {
private ClassToTest2 c2;
public ClassToTest2 getC2() {
return c2;
}
public void setC2(ClassToTest2 c2) {
this.c2 = c2;
}
public void somethingToTestVoid() throws Exception {
c2 = new ClassToTest2();
c2.doSomething();
System.out.println("OK!");
}
}
public class ClassToTest2 {
public ClassToTest2() {
}
public void doSomething() throws Exception {
throw new Exception("");
}
}
在测试课中,我试图做这样的事情:
@Test
public void test1() throws Exception {
ClassToTest1 c1 = Mockito.mock(ClassToTest1.class);
Mockito.doCallRealMethod().when(c1).somethingToTestVoid();
Mockito.doCallRealMethod().when(c1).setC2(Mockito.any());
ClassToTest2 c2 = Mockito.mock(ClassToTest2.class);
c1.setC2(c2);
Mockito.doNothing().when(c2).doSomething();
c1.somethingToTestVoid();
}
但doSomething
仍然会引发异常,因为c2
中的模拟somethingToTestVoid
和top
中使用的c2是不同的对象。
答案 0 :(得分:0)
终于找到了答案,也许有点乱,但它确实有效。
assert
答案 1 :(得分:0)
somethingToTestVoid()
通过c2
new
的新实例的事实
c2 = new ClassToTest2();
无法在没有任何变化的情况下使用Mockito测试您的案例。
其中一个选项是将此行重构为工厂方法(或某种DI)。您似乎应该调用getC2()
public void somethingToTestVoid() throws Exception {
c2 = getC2();
c2.doSomething();
System.out.println("OK!");
}
在这种情况下,你应该通过测试。
另一种选择是使用PowerMock拦截ClassToTest2
对象创建并模拟它。该框架还具有模拟静态方法的方法。所有你不应该在好的应用程序中做的事情。