3

Resteasy Docsで説明されているように、組み込みの Netty インスタンスを使用して、Resteasy でリソースをテストしようとしています。

パスパラメーターとクエリパラメーターの注入は魅力のように機能しますが、注入するリソースを次のようなコンテキストからテストしようHttpServletRequestとしました:HttpServletResponse

@GET
@Path("/")
public void example(@Context HttpServletResponse response, 
                    @Context HttpServletRequest request) { ... }

Resteasy はHttpServletRequestコンテキスト内で見つけることができず、次の例外をスローします。

5105 [r #1] DEB o.j.resteasy.core.SynchronousDispatcher  - PathInfo: /auth
5201 [r #1] ERR c.s.f.v.s.r.e.ApplicationExceptionMapper - Unhandled application exception: Unable to find contextual data of type: javax.servlet.http.HttpServletRequest
org.jboss.resteasy.spi.LoggableFailure: Unable to find contextual data of type: javax.servlet.http.HttpServletRequest

RESTEasy Mock vs. Exception Mapper vs. Contextで提案されているように、リクエストとレスポンスのモック バージョンをコンテキストに配置しようとしましたが、コンテキスト データが ThreadLocal であり、Netty がリクエストごとに新しいスレッドを生成するため、どちらも機能しません。

これを解決する方法についてのアイデアはありますか?

4

2 に答える 2

0

私の場合、アプリケーションで seam を使用しているため、org.jboss.seam.mock.HttpServletRequest を注入することでうまくいきました。spring.test や mockito などのモック フレームワークを試してみてください。

私のコードは次のようになります。

import org.jboss.resteasy.core.Dispatcher;
import org.jboss.resteasy.mock.MockDispatcherFactory;
import org.jboss.resteasy.mock.MockHttpRequest;
import org.jboss.resteasy.mock.MockHttpResponse;
import org.jboss.resteasy.plugins.server.resourcefactory.POJOResourceFactory;
import org.jboss.resteasy.spi.ResteasyProviderFactory;
import org.jboss.seam.mock.MockHttpServletRequest;
import org.jboss.seam.mock.DBUnitSeamTest;

public class Test extends DBUnitSeamTest{   

    @Test
    public void test() throws Exception {

        Dispatcher dispatcher = MockDispatcherFactory.createDispatcher();

        POJOResourceFactory noDefaults = new POJOResourceFactory(ClasstoBeTested.class);        dispatcher.getRegistry().addResourceFactory(noDefaults);
        MockHttpRequest request = MockHttpRequest.get("/serviceToBeTested/1961");
        MockHttpResponse response = new MockHttpResponse();

        HttpServletRequest servletRequest = new MockHttpServletRequest(getSession());
        ResteasyProviderFactory.getContextDataMap().put(HttpServletRequest.class, servletRequest);

        dispatcher.invoke(request, response);

        Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatus());
        Assert.assertTrue(response.getContentAsString().contains("1961")); 

    }
}
于 2015-06-18T15:29:41.213 に答える