Java 当所有节点都是模拟节点时,如何使用EasyMock测试“调用树”?

Java 当所有节点都是模拟节点时,如何使用EasyMock测试“调用树”?,java,easymock,Java,Easymock,假设我有三种类型:TopHandler、HandlerA和HandlerB。 它们每个都有一个空的handleSomething方法 TopHandler的实例保存对HandlerA和HandlerB实例的引用,并调用HandlerA和HandlerB上的句柄 在我的测试中,我想模拟所有三个对象,然后验证对topHandler的调用是否会导致对其他两个对象的调用 我如何具体说明?我知道EasyMock允许我指定模拟的预期行为,但我不清楚这里要使用什么功能。您不想模拟TopHandler,因为它似

假设我有三种类型:TopHandler、HandlerA和HandlerB。 它们每个都有一个空的handleSomething方法

TopHandler的实例保存对HandlerA和HandlerB实例的引用,并调用HandlerA和HandlerB上的句柄

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


我如何具体说明?我知道EasyMock允许我指定模拟的预期行为,但我不清楚这里要使用什么功能。

您不想模拟TopHandler,因为它似乎是您实际测试的类。在您的测试用例中,将另外两个模拟为正常,并检查它们是否被调用。如果你模仿所有的类,就没有什么可测试的了


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

您不想模拟TopHandler,因为它似乎就是您实际测试的类。在您的测试用例中,将另外两个模拟为正常,并检查它们是否被调用。如果你模仿所有的类,就没有什么可测试的了


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

根据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);
}

根据OP的描述,模拟的主界面是处理程序界面:

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);
}