2017-08-08 55 views
2

我想使用JUnit4測試一個實用方法,它將javax.ws.rs.core.Response作爲輸入參數。該方法查看Response屬性並根據響應代碼採取一些操作。當我剛剛建立在我的測試方法的響應,並使用提交:如何在JUint中創建javax.ws.rs.core.Response?

Response resp = Response.status(Status.INTERNAL_SERVER_ERROR).entity(respMessage).build(); 
ResponseParser.parseResponse(resp); 

我的實用方法拋出:

java.lang.IllegalStateException: RESTEASY003290: Entity is not backed by an input stream 
    at org.jboss.resteasy.specimpl.BuiltResponse.readEntity(BuiltResponse.java:231) 
    at org.jboss.resteasy.specimpl.BuiltResponse.readEntity(BuiltResponse.java:218) 

我的Util類基本上是:

import javax.ws.rs.core.Response; 
import javax.ws.rs.core.Response.Status.Family; 

public class ResponseParser { 

    public static void parseResponse(Response response) { 
    String errorResp = ""; 
    if (!response.getStatusInfo().getFamily().equals(Family.SUCCESSFUL)) { 
     int errorCode = response.getStatus(); 

     errorResp = response.readEntity(String.class); 

    } 
    } 
} 

我怎樣才能創建一個響應,如預期的那樣,將被流正確支持?我看了很多類似的問題,但他們似乎主要集中在測試或模擬端點呼叫。我只想測試我的解析方法。

回答

2

使用一些單元測試框架(如Mockito)來模擬響應。然後,您將能夠聲明每個響應方法調用返回的內容,甚至檢查是否調用了方法。

+1

查看我的答案,下面是我如何實現模擬的代碼示例。 – SteveS

1

我最終做了@albert_nil建議的事情。這裏是我的測試類的相關代碼。 MessageParseUtil.parseReportResponse(mockResponse);是正在測試的實用方法。

@Test 
    public void parse_Report_Response_400_Test() { 
    String respMessage = "400 : Validation error occurred. Invalid Parm: employeeID"; 
    Response mockResponse = buildMockResponse(Status.INTERNAL_SERVER_ERROR, respMessage); 

    try { 
     MessageParseUtil.parseReportResponse(mockResponse); 

     fail("Expected parseReportResponse() to throw error but none thrown."); 

    } catch (RestClientException e) { 
     Assert.assertEquals("Expected to status code to be 400 but was " + e.getStatusCode() + " instead.", 400, e.getStatusCode()); 
     Assert.assertEquals("The error message was missing or not correct.", respMessage, e.getErrorMessage().getErrorMessageList().get(0)); 
    } 
    } 

    private Response buildMockResponse(Status status, String msgEntity) { 
    Response mockResponse = mock(Response.class); 
    Mockito.when(mockResponse.readEntity(String.class)).thenReturn(msgEntity); 
    Mockito.when(mockResponse.getStatus()).thenReturn(status.getStatusCode()); 
    Mockito.when(mockResponse.getStatusInfo()).thenReturn(status); 

    return mockResponse; 
    }