首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >junit事件驱动测试

junit事件驱动测试
EN

Stack Overflow用户
提问于 2017-05-31 15:52:27
回答 3查看 1.7K关注 0票数 3

这是我第一次进行测试(是的,我以前从未运行过测试,但现在开始测试已经不晚了,不是吗?)

我有一个解析器,解析一个缓冲区,并分派一个事件)。

调用解析器:

代码语言:javascript
复制
parser.parse((ByteBuffer) readBuffer.duplicate().flip(), key);

解析方法:

代码语言:javascript
复制
@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));
}

事件处理程序:

代码语言:javascript
复制
@Override
public void handle(final ConnectionDataReadyArgs args) {
    //Do stuff here with the recieved args
}

如何创建一个junit测试,以检查在事件处理程序上收到的参数是否正确?

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-31 16:06:32

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

依赖注入使代码更易于测试。如果你幸运的话,你已经在注射eventDispatcher了。如果不是,通过将eventDispatcher作为构造函数参数,这将有助于使其成为构造函数参数:

代码语言:javascript
复制
  public MyClass(EventDispatcher eventDispatcher) {
       this.eventDispatcher = eventDispatcher;
  }

(你也可以使用一个设置器-但我更喜欢使我的对象不可变)

一旦你这样做了,你可以注入一个测试EventDispatcher

代码语言:javascript
复制
  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中发生的事情。

票数 3
EN

Stack Overflow用户

发布于 2017-05-31 16:04:20

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

票数 0
EN

Stack Overflow用户

发布于 2017-05-31 16:05:36

为了测试它,你必须决定你的方法是否有一个先决条件,这意味着,你可以假设收到的参数总是正确的,所以,在你的代码中,你将确保。如果您决定相反,您可以抛出一个异常,如果参数不是您所期望的,然后测试该方法是否抛出该异常:

因此,如果采用第二种方法,您可以创建一个exeption类,如下所示:

代码语言:javascript
复制
public class IlegalArgumentForXFunction extends Exeption {} //just an example

然后将它添加到函数中:

代码语言:javascript
复制
@Override
public void handle(final ConnectionDataReadyArgs args) throws IlegalArgumentForXFunction{
    if(args.checkIfAreIllegals == true){
        throw new IlegalArgumentForXFunction();
    }
    //Do stuff here with the recieved args
}

然后创建单元测试,类似于:

代码语言:javascript
复制
@Test(expected = IlegalArgumentForXFunction.class) 
public void testIfArgumentsAreIllegal() { 
     Myclass mc = new MyClass;
     ConnectionDataReadyArgs arg = new ConnectionDataReadyArgs(); //invalid args
     mc.handle(arg);
}

您可以检查源这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44289377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档