1

假设我有三种类型:TopHandlerHandlerAHandlerB。他们每个人都有一个void handle(Something)方法。

一个实例TopHandler持有对HandlerAand实例的引用,并且它在and上HandlerB调用。handle()HandlerAHandlerB

在我的测试中,我想模拟所有三个对象,然后验证对 topHandler 的调用是否会导致对其他两个对象的调用。

我该如何指定?我知道 EasyMock 可以让我指定模拟的预期行为,但我不清楚在这里使用哪些功能。

4

2 回答 2

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实现确实调用了handle()a 和 b 的方法:

@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);
}
于 2011-01-15T14:04:39.727 回答
2

您不想模拟 TopHandler,因为这似乎是您实际测试的类。在您的测试用例中,正常模拟其他两个并检查它们是否被调用。如果您模拟所有课程,则没有什么要测试的。

如果您实际上有另一个正在测试的类调用 TopHandler,那么您只需要验证在测试用例中是否调用了它,因为其他调用只是对 TopHandler 的测试。

于 2011-01-15T00:09:02.080 回答