这是我第一次进行测试(是的,我以前从未运行过测试,但现在开始测试已经不晚了,不是吗?)
我有一个解析器,解析一个缓冲区,并分派一个事件)。
调用解析器:
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测试,以检查在事件处理程序上收到的参数是否正确?
提前谢谢。
发布于 2017-05-31 16:06:32
编写代码后编写测试的一个问题是,您可能还没有为可测试性设计代码。
依赖注入使代码更易于测试。如果你幸运的话,你已经在注射eventDispatcher了。如果不是,通过将eventDispatcher作为构造函数参数,这将有助于使其成为构造函数参数:
public MyClass(EventDispatcher eventDispatcher) {
this.eventDispatcher = eventDispatcher;
}(你也可以使用一个设置器-但我更喜欢使我的对象不可变)
一旦你这样做了,你可以注入一个测试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中发生的事情。
发布于 2017-05-31 16:04:20
检查副作用。在事件处理程序中添加访问器方法,以便检查传递的值是否正确。如果文件内容正确,还可以让它写入文件并断言它。
发布于 2017-05-31 16:05:36
为了测试它,你必须决定你的方法是否有一个先决条件,这意味着,你可以假设收到的参数总是正确的,所以,在你的代码中,你将确保。如果您决定相反,您可以抛出一个异常,如果参数不是您所期望的,然后测试该方法是否抛出该异常:
因此,如果采用第二种方法,您可以创建一个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);
}您可以检查源这里
https://stackoverflow.com/questions/44289377
复制相似问题