2014-04-02 53 views
3

我已經基於澤西島的ContainerRequestFilter構建了一個小認證過濾器。對ContainerRequestFilter的junit測試 - 驗證WebApplicationException的實體

當請求未經授權時,會引發一些WebAplicationException,並且我想測試它。

我已經有這個,檢查要調用的濾波方法時,將引發異常並要求未經授權:

@Category(CommitTest.class) 
public class BasicAuthenticationFilterTest { 

    @Rule 
    public ExpectedException thrown = ExpectedException.none(); 

    @Test 
    public void someInvalidAuthTest() throws IOException { 
     //...setup auth filter, and mock objects 
     //Expect an WebApplicationException 

     thrown.expect(WebApplicationException.class); 
     authenticationFilter.filter(mockRequestContext); 
    } 
} 

我能做到這一點就好了,我的測試運行正常。但我希望能夠驗證異常的響應。

編輯

爲了澄清,我通常把我的例外情況是這樣的:

ApiError error = new ApiError(1, "UNAUTHORIZED", "No or empty authorization header"); 
throw new WebApplicationException(
    error.getMessage(), 
    Response.status(Response.Status.UNAUTHORIZED).entity(error).build()); 

我要驗證無論是在拋出的異常反應和實體。現在我知道這可能不可能。但我不得不要求確定。

或者我應該這樣測試一個完全不同的方式,並且實際設置了一個使用我的驗證過濾器的內存中類型的「服務器」,並向它做出實際的請求(然後驗證響應?)

+0

你是什麼「異常的反應均「?像異常消息?或者HTTP狀態碼? – Alden

+0

我通常創建一個響應,持有一個實體,當我拋出異常(響應和實體可能是球衣處理所有本身) - 我想驗證此實體,而不僅僅是異常類型+消息。 (儘管現在會這樣做)。 –

+0

好的感謝澄清,我更新了我的答案,以顯示我如何在我的項目中做到這一點。但是我通常也會將它作爲集成測試,並在預集成測試階段啓動服務器,所以實際上我沒有將它作爲單元測試運行。 – Alden

回答

3

您可以更新您的規則,以檢查異常消息,但在響應實體來獲得它可能會更容易的try/catch這樣的:

@Category(CommitTest.class) 
public class BasicAuthenticationFilterTest { 

    @Test 
    public void someInvalidAuthTest() throws IOException { 
     //...setup auth filter, and mock objects 

     try { 
      authenticationFilter.filter(mockRequestContext); 
      fail("expect a WebApplicationException"); 
     } 
     catch (WebApplicationException e) { 
      Response r = e.getResponse(); 

      // validate status code 
      assertEquals(Response.Status.UNAUTHORIZED, r.getStatusInfo()); 

      // validate entity 
      ApiError error = r.readEntity(ApiError.class); 
      assertEquals("No or empty authorization header", error.getMessage()); 
     } 
    } 
} 
+0

工作很好,根本沒想到這個方法。感謝您的回答。 –