在Mockito partial mock

时间:2017-10-29 18:37:01

标签: java unit-testing mockito

我是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中的模拟somethingToTestVoidtop中使用的c2是不同的对象。

2 个答案:

答案 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对象创建并模拟它。该框架还具有模拟静态方法的方法。所有你不应该在好的应用程序中做的事情。