2011-12-15 29 views
0

我有Struts 1操作並希望單獨對其進行測試。 什麼這個動作做如下:使用參數從請求使用模擬對象時測試粒度

  • 負載數據這個數據的
  • 構建基於XML的表示
  • 直接發送該響應給客戶機

我使用jMock進行測試,但在這裏有一個疑問。 我的第一個測試是評估以這種

public void shouldActionInvocationPrintValidResponse() { 
    ProcessingAction action = new ProcessingAction(); 

    DBService service = mock(DBService.class); 
    List records = new ArrayList(); 
    when(service.loadData()).thenReturn(records); 

    ResponseBuilder builder = mock(ResponseBuilder.class); 
    when(builder.buildResponse(records)).thenReturn("fake response"); 

    action.execute(null, null, null, null); 

    assertEquals("fake response", writer.getContentWritten()); 
} 

我的督促代碼:

public String execute(...) { 
    List recordsList = service.loadData(); 
    String response = responseBuilder.buildResponse(recordsList); 
    response.getWriter().print(response); 
} 

我在這裏的疑問是,如果這樣的測試是不是太大這裏。我在這裏檢查整個成功的流程。不應該有單獨的測試來檢查他們自己的測試中的每個依賴項調用嗎?

我在想,因爲我在這個測試的名字上遇到了麻煩。我一開始的想法是像

shouldFetchDataThenFormatThemAndSendResponse 

由於這是所有測試呢,這個名字表明它可能不會太多(看在「和」如測試名稱)

,並應我一次寫完整個測試,或者只是逐步添加依賴關係調用?編號: 提供測試和操作的詳細代碼。

+0

這行代碼無法編譯:`response.getWriter()。print(response);`好像作家也應該被嘲笑。 – 2011-12-15 15:57:49

回答

1

我認爲你是在正確的軌道上。 shouldFetchDataThenFormatThemAndSendResponse這說明了一切。在您的測試命名中,您正在討論實施細節。這就是你的第一次測試應該如何寫的。

ProcessingAction action = new ProcessingAction(); 

Response response = action.execute(); 

assertEquals(true, response.IsValid); 

嘗試:shouldGetResponseWhenActionExecuted

現在您可以查看執行操作時如何獲得響應。

我敢打賭你美元甜甜圈,你沒有TDD這個。

切記:意圖執行!停止展示你的硬皮內衣。

0

很難在沒有看到代碼的情況下回答你的問題,但是我會給它一個刺。對於測試是單元測試,它不應該測試除了被測試的類中的代碼以外的代碼。如果你嘲笑了所有其他課堂的動作,並且你正在驗證的課程只在被測試的課堂內完成,那麼測試不會太大。我編寫了大量驗證語句的單元測試,因爲由於該方法的單一調用,所有的事情都發生在被測試的類中。

我的單元測試的規則是:在測試 2. 1.練習代碼只在類只有在進入法測試每一次的測試方法

+0

我剛剛在上面的代碼中添加了一些細節 – grafthez 2011-12-15 15:19:08

0

我同意約翰B. 此外,如果您使用模擬測試亞軍並正確寫入,您可能不需要斷言。