yinmingjuncn
yinmingjuncn

Reputation: 51

How to mock rest-easy's asynchronous HTTP request?

Is there an offical way to mock a rest-easy asynchronous HTTP request?

The sample code:

@GET
@Path("test")
public void test(@Suspended final AsyncResponse response) {

    Thread t = new Thread() {
        @Override
        public void run()
        {

            try {
                Response jaxrs = Response.ok("basic").type(MediaType.APPLICATION_JSON).build();
                response.resume(jaxrs);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }

    };
    t.start();
}

I offen mock rest-easy's request this way:

@Test
public void test() throws Exception {
    /**
     * mock
     */
    Dispatcher dispatcher = MockDispatcherFactory.createDispatcher();

    dispatcher.getRegistry().addSingletonResource(action);
    MockHttpRequest request = MockHttpRequest.get("/hello/test");
    request.addFormHeader("X-FORWARDED-FOR", "122.122.122.122");
    MockHttpResponse response = new MockHttpResponse();

    /**
     * call
     */
    dispatcher.invoke(request, response);

    /**
     * verify
     */
    System.out.println("receive content:"+response.getContentAsString());
}

BUT it dosn't work. I got a BadRequestException during the unit test.

What's the right way to mock a rest-easy asynchronous HTTP request?

Upvotes: 1

Views: 600

Answers (1)

yinmingjuncn
yinmingjuncn

Reputation: 51

By reading rest-easy's source code, I finally find a way to work around with asynchronous HTTP request :

@Test
public void test() throws Exception {
    /**
     * mock
     */
    Dispatcher dispatcher = MockDispatcherFactory.createDispatcher();

    dispatcher.getRegistry().addSingletonResource(action);
    MockHttpRequest request = MockHttpRequest.get("/hello/test");
    request.addFormHeader("X-FORWARDED-FOR", "122.122.122.122");
    MockHttpResponse response = new MockHttpResponse();
    // Add following two lines !!!
    SynchronousExecutionContext synchronousExecutionContext = new SynchronousExecutionContext((SynchronousDispatcher)dispatcher, request, response );
    request.setAsynchronousContext(synchronousExecutionContext);

    /**
     * call
     */
    dispatcher.invoke(request, response);

    /**
     * verify
     */
    System.out.println("receive content:"+response.getContentAsString());
}

The output of response is correct !!!

Upvotes: 1

Related Questions