java - Junit 事件驱动测试

标签 java junit

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

我有一个解析缓冲区并分派(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/

相关文章:

java - ReentrantLock - 并发转账操作

java - GCJ 和 Java 主页

java - Elasticsearch 中的嵌套分析字段没有命中

java - 如何通过 Java 在 Apache Spark 中注册不带参数的 UDF

unit-testing - 是否可以为 Gradle 测试任务动态配置系统属性?

java - 如何使用 onRestart() 取消暂停/重启 Android Activity 中的线程?

java - 单元测试 - 在哪里放置初始化代码?

android - JUnit 版本 3.8 或更高版本预计在 android studio 4.1 上

java - ant junit 任务——在哪里下载 ant-junit.jar 并将它放在哪里?

java - 用多个类别标记一个测试类