我有一个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来完成,那将减少工作量