如何模拟Jersey REST客户端抛出HTTP 500响应



我正在编写一个Java类,它在底层使用Jersey向RESTful API(第三方)发送HTTP请求。

我还想编写一个JUnit测试,模拟发送回HTTP 500响应的API。作为泽西岛的新手,我很难理解我必须做些什么来嘲笑这些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,但对mock库没有偏好。基本上,如果有人能告诉我哪些类/方法需要被模拟以抛出HTTP 500响应,我可以弄清楚如何实际实现模拟。

试试这个:

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);

我不知道jersey,但从我的理解,我认为实际调用是在调用get()方法时完成的。因此,您可以使用一个真正的WebResource对象并替换get(String)方法的行为来抛出异常,而不是实际执行http调用。

我正在写一个Jersey web应用程序…我们为HTTP错误响应抛出WebApplicationException。您可以简单地将响应代码作为构造函数参数传递。例如,

throw new WebApplicationException(500);

当此异常在服务器端抛出时,它在我的浏览器中显示为500 HTTP响应。

不确定这是否是你想要的…但我觉得输入可能会有帮助!祝你好运。

我能够用以下代码模拟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.
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新