如何在 JUnit 中创建 javax.ws.rs.core.Response?
How do I create a javax.ws.rs.core.Response in JUint?
我正在尝试使用 JUnit4 测试一个将 javax.ws.rs.core.Response 作为输入参数的实用方法。该方法查看 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)
我的工具 class 基本上是:
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);
}
}
}
我如何创建一个响应,该响应将按照 resteasy 的预期由流正确支持?我看了很多类似的问题,但它们似乎主要围绕测试或模拟端点调用。我只是想测试一下我的解析方法。
使用 Mockito 等单元测试框架模拟 Response。然后,您将能够在每次响应方法调用时声明要 return 的内容,甚至可以检查是否已调用方法。
我最终确实按照@albert_nil的建议做了。这是我测试 class 中的相关代码。 MessageParseUtil.parseReportResponse(模拟响应);是正在测试的实用程序方法。
@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;
}
我正在尝试使用 JUnit4 测试一个将 javax.ws.rs.core.Response 作为输入参数的实用方法。该方法查看 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)
我的工具 class 基本上是:
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);
}
}
}
我如何创建一个响应,该响应将按照 resteasy 的预期由流正确支持?我看了很多类似的问题,但它们似乎主要围绕测试或模拟端点调用。我只是想测试一下我的解析方法。
使用 Mockito 等单元测试框架模拟 Response。然后,您将能够在每次响应方法调用时声明要 return 的内容,甚至可以检查是否已调用方法。
我最终确实按照@albert_nil的建议做了。这是我测试 class 中的相关代码。 MessageParseUtil.parseReportResponse(模拟响应);是正在测试的实用程序方法。
@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;
}