这是我第一次进行测试(是的,我以前从未运行过测试,但开始永远不会晚,不是吗?)
我有一个解析缓冲区并分派(dispatch)事件的解析器)。
调用解析器:
parser.parse((ByteBuffer) readBuffer.duplicate().flip(), key);
解析方法:
@Override
public void parse(final ByteBuffer buffer, final SelectionKey key) {
//Parse some stuff here and then dispatch a new event
eventDispatcher.dispatch(new ConnectionDataReadyArgs(key, host.toString(), port));
}
事件处理器:
@Override
public void handle(final ConnectionDataReadyArgs args) {
//Do stuff here with the recieved args
}
如何创建一个 junit 测试来检查事件处理程序接收到的参数是否正确?
提前致谢。
最佳答案
在编写代码后编写测试的一个问题是,您可能没有为可测试性设计代码。
依赖注入(inject) 使代码更易于测试。如果幸运的话,您已经注入(inject)了 eventDispatcher
。如果没有,将 eventDispatcher
设为构造函数参数将有助于实现这一点:
public MyClass(EventDispatcher eventDispatcher) {
this.eventDispatcher = eventDispatcher;
}
(您也可以使用 setter——但我更喜欢让我的对象不可变)
完成后,您可以注入(inject)测试 EventDispatcher
:
class TestEventDispatcher implements EventDispatcher {
public Event event;
public EventDispatchChain tail;
public Event dispatchEvent(Event event, EventDispatchChain tail) {
this.event = event;
this.tail = tail;
return null;
}
}
TestEventDispatcher testDispatcher = new TestEventDispatcher();
MyClass testObject = new MyClass(testDispatcher);
testObject.dosomething();
assertThat(testDispatcher.event, someMatcher(...));
模拟框架(例如 Mockito 或 JMock)为此提供了一种动态且流畅的方式来创建模拟对象。它在很多方面都比我在此处所做的创建临时静态测试实现要好。阅读其中任何一个的介绍性文档。
这用于单元测试。您可能还需要一些集成测试,这些测试使用真实的 EventDispatcher
以及您自己的几个对象,检查当对象 A 中发生某些事情时,eventDispatcher
触发并且某些事情发生在对象 B.
关于java - Junit 事件驱动测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44289377/