Java junit事件驱动测试

Java junit事件驱动测试,java,junit,Java,Junit,这是我第一次进行测试(是的,我以前从未运行过测试,但开始测试永远不会太晚,不是吗?) 我需要一个解析器来解析缓冲区,并分派一个事件) 调用解析器: parser.parse((ByteBuffer) readBuffer.duplicate().flip(), key); 解析方法: @Override public void parse(final ByteBuffer buffer, final SelectionKey key) { //Parse some stuff here

这是我第一次进行测试(是的,我以前从未运行过测试,但开始测试永远不会太晚,不是吗?)

我需要一个解析器来解析缓冲区,并分派一个事件)

调用解析器:

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测试来检查事件处理程序上接收的参数是否正确


提前谢谢。

检查副作用。在事件处理程序中添加访问器方法,以便检查所传递的值是否正确。您还可以将其写入文件,并在文件内容正确时断言它。

为了测试它,您必须了解您必须决定您的方法是否具有先决条件,这意味着,您可以假设接收到的参数始终正确,因此,在您的代码中,您将确保。 如果您做出相反的决定,则可以在参数不符合预期的情况下引发异常,然后测试该方法是否引发该异常:

因此,如果您选择第二种方式,您可以创建一个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);
}

您可以检查源代码

在编写代码后编写测试的一个问题是,您可能没有为可测试性设计代码

依赖项注入使代码更易于测试。如果幸运的话,您已经在注入
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中发生某些事情时,
EventDispatcher
触发,并且对象B中发生了一些事情。

jpllosa,您能用更多的数据说明一下您的建议吗?也许我不明白,我不能理解你,对不起。谢谢这是一个完美答案的例子。谢谢分享我已经在用guice做DP了。非常感谢你的回答,我同意这个建议。