假设我有三种类型:TopHandler
,HandlerA
和HandlerB
。
他们每个人都有一个void handle(Something)
方法。
TopHandler
的实例保存对HandlerA
和HandlerB
实例的引用,并在handle()
和HandlerA
上调用HandlerB
。< / p>
在我的测试中,我想模拟所有三个对象,然后验证topHandler上的调用是否会导致另外两个上的调用。
我该如何指定?我知道EasyMock允许我指定模拟的预期行为,但我不清楚这里使用什么功能。
答案 0 :(得分:3)
根据OP的描述,被模拟的主界面是Handler
界面:
public interface Handler {
void handle(String o);
}
所有三个模拟对象都应实现此接口,TopHandler类是被测试的类:
public static class TopHandler implements Handler {
private Handler a;
private Handler b;
public TopHandler(Handler a, Handler b) {
this.a = a; this.b = b;
}
public void handle(String o) {
a.handle(o);
b.handle(o);
}
}
测试用例必须验证TopHandler
实现确实调用a和b的handle()
方法:
@Test
public void testTopHandler() throws Exception {
Handler mockA = EasyMock.createMock(Handler.class);
mockA.handle("Test");
EasyMock.expectLastCall().once();
Handler mockB = EasyMock.createMock(Handler.class);
mockB.handle("Test");
EasyMock.expectLastCall().once();
TopHandler handler = new TopHandler(mockA, mockB);
EasyMock.replay(mockA, mockB);
handler.handle("Test");
EasyMock.verify(mockA, mockB);
}
答案 1 :(得分:2)
你不想模拟TopHandler,因为它似乎是你实际测试的类。在您的测试用例中,正常模拟其他两个并检查它们是否被调用。如果你嘲笑你所有的课程,就没有什么可以测试的。
如果您确实有另一个正在测试的类调用TopHandler,那么您只需要验证在测试用例中调用它,因为其他调用只是对TopHandler的测试。