java - 当所有节点都是模拟时,如何使用 EasyMock 测试 "tree of calls"?

标签 java easymock

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

TopHandler 的实例包含对 HandlerAHandlerB 实例的引用,并调用 handle()HandlerAHandlerB 上。

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

我该如何指定?我知道 EasyMock 允许我指定模拟的预期行为,但我不清楚要在此处使用哪些功能。

最佳答案

根据OP的描述,mock的主要接口(interface)是Handler接口(interface):

public interface Handler {
    void handle(String o);
}

所有三个模拟对象都应实现此接口(interface)并且 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);
}

关于java - 当所有节点都是模拟时,如何使用 EasyMock 测试 "tree of calls"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4696974/

相关文章:

java - 设置 JXL 自定义字体

java - 类数据类型的 EasyMock 匹配器

java - 请求时的简单模拟行为

Java 对其他类的独占方法

java - InterruptedIOException 使用 httpClient 4.3.3 for Android

java - 有没有办法在java项目中阻止EasyMock的良好控制?

java - 如何使用easymock模拟类中的静态方法?

java - 使用模拟对象进行 Junit 测试

java - 抛出已检查异常与抛出包装的 RuntimeException

java - 从填充的 HashMap 中检索到的 Arraylist 不断返回一个空的 arraylist