我正在编写一个Java类,它使用Jersey来向RESTful API(第三方)发送HTTP请求。
我还想编写一个JUnit测试来模拟API发回HTTP 500响应。作为泽西岛的新手,我很难看到我必须做些什么来模拟这些HTTP 500响应。
到目前为止,这是我最好的尝试:
// The main class-under-test
public class MyJerseyAdaptor {
public void send() {
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
String uri = UriBuilder.fromUri("http://example.com/whatever").build();
WebResource service = client.resource(uri);
// I *believe* this is where Jersey actually makes the API call...
service.path("rest").path("somePath")
.accept(MediaType.TEXT_HTML).get(String.class);
}
}
@Test
public void sendThrowsOnHttp500() {
// GIVEN
MyJerseyAdaptor adaptor = new MyJerseyAdaptor();
// WHEN
try {
adaptor.send();
// THEN - we should never get here since we have mocked the server to
// return an HTTP 500
org.junit.Assert.fail();
}
catch(RuntimeException rte) {
;
}
}
我熟悉Mockito,但对模拟库没有偏好。基本上如果有人可以告诉我需要模拟哪些类/方法来抛出HTTP 500响应,我可以弄清楚如何实际实现模拟。
答案 0 :(得分:4)
试试这个:
WebResource service = client.resource(uri);
WebResource serviceSpy = Mockito.spy(service);
Mockito.doThrow(new RuntimeException("500!")).when(serviceSpy).get(Mockito.any(String.class));
serviceSpy.path("rest").path("somePath")
.accept(MediaType.TEXT_HTML).get(String.class);
我不知道球衣,但根据我的理解,我认为实际的调用是在调用get()方法时完成的。
因此,您可以使用真正的WebResource对象并替换get(String)
方法的行为来抛出异常,而不是实际执行http调用。
答案 1 :(得分:1)
我正在编写Jersey Web应用程序...我们为HTTP错误响应抛出WebApplicationException。您只需将响应代码作为构造函数参数传递即可。例如,
throw new WebApplicationException(500);
当在服务器端抛出此异常时,它会在我的浏览器中显示为500 HTTP响应。
不确定这是否是您想要的......但我认为输入可能有所帮助!祝你好运。
答案 2 :(得分:0)
我能够使用以下代码模拟500个响应:
@RunWith(MockitoJUnitRunner.class)
public class JerseyTest {
@Mock
private Client client;
@Mock
private WebResource resource;
@Mock
private WebResource.Builder resourceBuilder;
@InjectMocks
private Service service;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void jerseyWith500() throws Exception {
// Mock the client to return expected resource
when(client.resource(anyString())).thenReturn(resource);
// Mock the builder
when(resource.accept(MediaType.APPLICATION_JSON)).thenReturn(resourceBuilder);
// Mock the response object to throw an error that simulates a 500 response
ClientResponse c = new ClientResponse(500, null, null, null);
// The buffered response needs to be false or else we get an NPE
// when it tries to read the null entity above.
UniformInterfaceException uie = new UniformInterfaceException(c, false);
when(resourceBuilder.get(String.class)).thenThrow(uie);
try {
service.get("/my/test/path");
} catch (Exception e) {
// Your assert logic for what should happen here.
}
}
}