2016-07-28 322 views
5

我們有一個從瀏覽器調用的REST終點(JAX-RS)。我們正在傳遞OutputStream,以便我們可以讓瀏覽器顯示調用的結果。我們如何單元測試這個lambda表達式?

這裏是方法。

@Path("/mypath/{userId}") 
@POST 
public Response createUser(@PathParam("userId") final int userId) { 
    StreamingOutput stream = (outputStream) -> { 
     User user = userHelper.findUser(userId); 
     userHelper.updateUser(user,outputStream); 
    }; 

    return Response.ok(stream).build(); 
} 

使用JUnit和的Mockito,我們如何驗證是否userHelper.findUseruserHelper.updateUser被稱爲

基本上我們只是想驗證交互。

+1

你必須注入一個模擬的userHelper。你是否已經創建了一個TestCase? – Fildor

+0

是的。這是行不通的。交互不會發生,因爲它是一個lambda表達式。 – vinoth

+1

所以你的測試應該觸發交​​互,然後驗證一個模擬 –

回答

0

StreamingOutput僅在另一端(通常是瀏覽器)的某個人開始從中拉出時才被調用。您的測試案例需要接管並且(如評論所建議的那樣)開始與響應進行交互。

2

要「單元」測試,您應該創建您的測試類並創建此方法屬於測試類的類的新實例。 userHelper沒有在lambda中定義,所以它是一個類成員?如果是這樣,可以嘲笑:

  • 創建的Mockito
  • inject模擬一個mock userhelper對象到您的測試類。
  • 調用createUser方法。
  • verify上模擬來斷言updateUser方法被調用一次。
  • 您可以更進一步,使用captors驗證用戶和outputStream對象是否通過。