JUnit的事件驱动测试
这是在测试我第一次(是的,我以前从来没有运行测试,但它都不会太晚上手,是不是?)JUnit的事件驱动测试
我倒是一个解析器分析一个缓冲区,并分派一个事件)。
调用解析器:
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测试,如果接收到的参数,检查事件处理程序是对的?
在此先感谢。
检查副作用。在事件处理程序中添加访问器方法,以便您可以检查传递的值是否正确。如果文件内容正确,您也可以将其写入文件并进行声明。
为了测试它,你必须understan,你必须决定,如果你的方法有一个前提条件或没有,这意味着,你可以假设收到的参数始终是正确的,那么,在你的代码,你将确保。 如果你决定相反的话,如果参数不是你所期望的,你可以抛出一个异常,然后测试该方法是否抛出异常:
因此,如果你选择第二种方式,你可以创建一个exeption类,如:
public class IlegalArgumentForXFunction extends Exeption {} //just an example
然后你把它添加到你的函数:
@Override
public void handle(final ConnectionDataReadyArgs args) throws IlegalArgumentForXFunction{
if(args.checkIfAreIllegals == true){
throw new IlegalArgumentForXFunction();
}
//Do stuff here with the recieved args
}
然后创建单元测试,是这样的:
@Test(expected = IlegalArgumentForXFunction.class)
public void testIfArgumentsAreIllegal() {
Myclass mc = new MyClass;
ConnectionDataReadyArgs arg = new ConnectionDataReadyArgs(); //invalid args
mc.handle(arg);
}
您可以编写代码之后检查来源here写作测试
的一个问题是,你可能没有设计的可测试性的代码。
依赖注入使得代码更容易测试。如果幸运的话,你已经注入eventDispatcher
。如果不是,这将有助于使它这样,通过使eventDispatcher
构造函数的参数:
public MyClass(EventDispatcher eventDispatcher) {
this.eventDispatcher = eventDispatcher;
}
(你也可以使用一个setter - 但我更愿意让我的目标是不变的)
一旦你已经做了,你可以注入一个测试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中发生什么事情时,会触发对象B中的某些事情并发生一些事情。
这是一个完美答案的例子。感谢我已经使用的吉斯DP共享 –
。非常感谢你的回答,我会这样说。 – Juan
jpllosa,您能解释更多的数据集你在建议什么?也许我不明白,我不能跟着你,对不起。谢谢 –