2017-05-31 95 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