Как использовать EasyMock для проверки «дерева вызовов», когда все узлы являются ложными? - PullRequest
1 голос
/ 15 января 2011

Предположим, у меня есть три типа: TopHandler, HandlerA и HandlerB. У каждого из них есть метод void handle(Something).

Экземпляр TopHandler содержит ссылки на экземпляры HandlerA и HandlerB и вызывает handle() на HandlerA и HandlerB.

В моем тесте я хочу смоделировать все три объекта, а затем убедиться, что вызов topHandler вызовет вызов двух других.

Как мне это указать? Я знаю, что EasyMock позволяет мне указать ожидаемое поведение макетов, но мне неясно, какие функции здесь использовать.

Ответы [ 2 ]

3 голосов
/ 15 января 2011

Согласно описанию 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);
}
2 голосов
/ 15 января 2011

Вы не хотите издеваться над TopHandler, так как это класс, который вы на самом деле тестируете. В вашем тестовом случае, смоделируйте два других как обычно и проверьте, что они были вызваны. Если вы издеваетесь над всеми своими классами, вам нечего проверять.

Если у вас на самом деле тестируется другой класс, который вызывает TopHandler, то вам нужно только убедиться, что он вызывается в тестовом примере, поскольку другие вызовы являются тестом только для TopHandler.

...