单元测试@Suspended AsyncResponse控制器

时间:2017-06-19 18:23:13

标签: java unit-testing junit jersey dropwizard

我正在升级为完全异步,我有一个exsiting测试单元测试控制器与模拟依赖项并测试各种路径。我无法弄清楚如何转换此单元测试。我正在使用dropwizard / jersey,我想测试的方法现在看起来像这样

 @POST
public void getPostExample(final Map body, @Suspended final AsyncResponse
 asyncResponse){}

旧测试使用mockito / junit并使用@InjectMocks作为控制器,然后调用getPostExample上的方法并声明响应的一些信息。它调用的服务是模拟的,但是当我搜索如何手动获取它以返回数据时,我找不到多少。我可以访问AsyncResponse但是在实际代码中调用带有结果的简历。我应该在测试中调用简历吗?

2 个答案:

答案 0 :(得分:7)

“我应该在测试中调用简历”。不。您应该做的是测试使用预期参数调用resume方法。这是测试方法的行为的方法。

你可以做的是使用Mockito的ArgumentCaptor来捕获传递给Response方法的resume,然后在Response上进行断言。您需要模拟AsyncResponse才能使其正常工作。以下是一个例子

@RunWith(MockitoJUnitRunner.class)
public class AsyncMockTest {

    @Mock
    private AsyncResponse response;

    @Captor
    private ArgumentCaptor<Response> captor;

    @Test
    public void testAsyncResponse() {
        final TestResource resource = new TestResource();
        resource.get(this.response);

        Mockito.verify(this.response).resume(this.captor.capture());
        final Response res = this.captor.getValue();

        assertThat(res.getEntity()).isEqualTo("Testing");
        assertThat(res.getStatus()).isEqualTo(200);
    }

    @Path("test")
    public static class TestResource {
        @GET
        @ManagedAsync
        public void get(@Suspended AsyncResponse response) {
            response.resume(Response.ok("Testing").build());
        }
    }
}

答案 1 :(得分:0)

添加嘲笑after()方法调用以等待另一个线程完成;应该可以解决异常问题,例如: Mockito.verify(response, after(10000)).resume(this.captor.capture());