我在尝试设置 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));
行)