gpt4 book ai didi

java - 使用 Netty 在 Resteasy 测试中注入(inject)上下文数据

转载 作者:行者123 更新时间:2023-12-02 07:15:16 26 4
gpt4 key购买 nike

我正在尝试使用嵌入的 Netty 实例通过 Resteasy 测试资源,如 Resteasy Docs 中所述。 。

注入(inject)路径参数和查询参数就像一个魅力,但后来我尝试测试从上下文注入(inject) HttpServletRequestHttpServletResponse 的资源,如下所示:

@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 为每个请求生成一个新线程。

关于如何解决这个问题有什么想法吗?

最佳答案

在我的例子中有效的是注入(inject) org.jboss.seam.mock.HttpServletRequest,因为我在我的应用程序中使用seam。您应该尝试一些模拟框架,例如 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"));

}
}

关于java - 使用 Netty 在 Resteasy 测试中注入(inject)上下文数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19378092/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com