2017-05-31 40 views
2

这是在测试我第一次(是的,我以前从来没有运行测试,但它都不会太晚上手,是不是?)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测试,如果接收到的参数,检查事件处理程序是对的?

在此先感谢。

回答

0

检查副作用。在事件处理程序中添加访问器方法,以便您可以检查传递的值是否正确。如果文件内容正确,您也可以将其写入文件并进行声明。

+0

jpllosa,您能解释更多的数据集你在建议什么?也许我不明白,我不能跟着你,对不起。谢谢 –

0

为了测试它,你必须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写作测试

1

的一个问题是,你可能没有设计的可测试性的代码。

依赖注入使得代码更容易测试。如果幸运的话,你已经注入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中的某些事情并发生一些事情。

+0

这是一个完美答案的例子。感谢我已经使用的吉斯DP共享 –

+0

。非常感谢你的回答,我会这样说。 – Juan