0

我在尝试设置 Mockery 来测试方法调用时遇到了问题。我看到了如何使用 JUnit 和 JMock 测试抽象类的受保护方法,这基本上是同一个问题,但我无法弄清楚克里斯在他的回答中指的是什么。如果可以,请有人以稍微不同的方式或更完整的英语向我解释。我正在使用 JUnit、JMock2、Infinitest(如果重要的话)和一个标准的基于事件的消息系统,如下所示:

public Interface MyEventListener {
    void handleMyEvent(MyEvent e);
}

public Class MyEvent extends EventObject {
    public MyEvent(Object source) {
        super(source);
    }
}

public Class MySource {
    protected List<MyEventListener> listeners = new ArrayList<MyEventListeners>();

    public void addListener(MyEventListener listener) {
        listeners.add(listener);
    }

    public void removeListener(MyEventListener listener) {
        listeners.remove(listener);
    }

    // other code...

    protected void raiseEvent() {
        for (MyEventListener listener : listeners) {
            listener.handleMyEvent(new MyEvent(this));
        }
    }
}

现在这是我的测试:

@Test
public void sourceShouldThrowEventOnEventOccurrence() {
    // set up
    Mockery context = new Mockery();
    MyEventListener listener = context.mock(MyEventListener.class);
    MySource source = new MySource();
    MyEvent event = new MyEvent(source);
    source.addListener(listener);

    // set expectations
    context.checking(new Expectations() {{
        oneOf(listener).handleMyEvent(event);
    }});

    // execute
    // do stuff to (theoretically) raise event

    // verify
    context.assertIsSatisfied();
}

我在 MySource 中的 raiseEvent() 受保护方法上收到了 ExpectationError(意外调用)。我怎样才能增加它应该调用受保护方法的期望?

另外,我刚刚想到了一个想法——但在我去探索它之前,我仍然会发布这条消息(以防其他人有同样的问题,而我的想法最终是否正确)。该错误可能与我的代码中有两个新关键字有关吗?我在 MySource.raiseEvent() 中有新的 MyEvent(this),然后在测试中有新的 MyEvent(source)。这会在内存中创建两个不同的事件......错误是否与它期望方法获取一个事件但接收另一个事件的可能性有关?

*****编辑

实际上,具体来说,我在实际引发事件的代码行上得到了一个 ExpectationError(意外调用)。(在我上面的代码中,该listener.handleMyEvent(new MyEvent(this));行)

4

1 回答 1

0

事实证明,我怀疑这与创建两个不同的 MyEvent 实例有关是正确的。不幸的是,这意味着我的问题的标题具有误导性。挖掘后,我发现一旦我将 Expectations() 更改为以下代码,我的代码就可以正常工作。

@Test
public void sourceShouldThrowEventOnEventOccurrence() {
    // set up
    Mockery context = new Mockery();
    MyEventListener listener = context.mock(MyEventListener.class);
    MySource source = new MySource();
    // MyEvent event = new MyEvent(source);  <-- NO LONGER NEEDED
    source.addListener(listener);

    // set expectations
    context.checking(new Expectations() {{
        oneOf(listener).handleMyEvent(with(any(MyEvent.class)));  // <-- with any
    }});

    // execute
    // do stuff to (theoretically) raise event

    // verify
    context.assertIsSatisfied();
}
于 2012-05-09T16:06:53.270 回答