我有一个StrictPartialMock(用createStrictPartialMock(class, "method1")创建)。和普通的mockedObject

我想测试method1()是否按此顺序调用StrictPartialMock.method2()mockedObject.method1()StrictPartialMock.method3()

现在我读到我可以使用private IMocksControl ctrl = createStrictControl();创建一个可以检查模拟之间方法调用顺序的控件,但是IMocksControl不支持createPartialMock()

有什么办法可以结合这两种技术?

最佳答案

我目前通过扩展我正在测试的课程来解决此问题。我之所以这样做,是因为我的受测课程是abstract,但是我想只要不是final,这都是可能的。

@test
public voide testCase() {
    IMocksControl ctrl = createStrictControl();
    OrderTester mockedOrderTester = ctrl.createMock(OrderTester.class);
    MyObject mockedMyObject = ctrl.createMock(MyObject.class);
    mockedOrderTester.method2()
    expectLastCall();
    mockedMyObject .method1()
    expectLastCall();
    mockedOrderTester.method3()
    expectLastCall();
    ctrl.replay();
    ClassUnderTestExt testClass = new ClassUnderTestExt();
    testClass.ot = mockedOrderTester;
    testClass.mo = mockedMyObject;
    testClass.method1();
    ctrl.verify();
}


class ClassUnderTestExt extends ClassUnderTest<String> {
    public OrderTester ot;
    public MyObject mo;

    @Override
    public void writeOutput(String data) {
    }

    @Override
    public void method2() {
        super.method2();
        ot.method2();
    }

    @Override
    public void method3() {
        super.method3();
        ot.method3();
    }
}

class OrderTester {
    public void method2() {
    }

    public void method3() {
    }
}


注意,您可以省略super.methodX();来模拟真实的部分模拟。

但是这种解决方案远非完美。如果可以通过部分模拟和IMocksControl来完成,那将减少工作量

10-05 19:08