Java 如何将@Context注释字段注入RestEasy@Provider?
使用JBoss容器中的RestEasy,我有一个用Java 如何将@Context注释字段注入RestEasy@Provider?,java,jboss,resteasy,jmockit,Java,Jboss,Resteasy,Jmockit,使用JBoss容器中的RestEasy,我有一个用@Provider注释的ExceptionMapper,它可以通过@Context注释访问HttpServletRequest和HttpServletResponse,如下所示: @Provider public class MyExceptionMapper implements ExceptionMapper<Throwable> { @Context private HttpServletRequest httpServ
@Provider
注释的ExceptionMapper
,它可以通过@Context
注释访问HttpServletRequest
和HttpServletResponse
,如下所示:
@Provider
public class MyExceptionMapper implements ExceptionMapper<Throwable> {
@Context
private HttpServletRequest httpServletRequest;
@Context
private HttpServletResponse httpServletResponse;
@Override
public Response toResponse(final Throwable exception) {
...
return response;
}
}
但这会导致在我第一次引用@Context
字段时,MyExceptionMapper
中出现NullPointerException
,它告诉我它们没有被注入
我也试过:
- 使用
而不是@Mocked
李>@Injectable
- 直接实例化带有和不带有
注释的@Tested
李>MyExceptionMapper
- 在我的测试中创建
;及期望值
- 上面的每一个排列
@Context
-注释字段均为null
希望我只是错过了一些非常明显的东西?在没有更好的答案的情况下,我最终在测试中使用反射来为这两个属性注入值。不理想,但它可以工作:
public class MyExceptionMapperTest {
@Mocked
private HttpServletRequest mockHttpServletRequest;
@Mocked
private HttpServletResponse mockHttpServletResponse;
private MyExceptionMapper exceptionMapper = new MyExceptionMapper();
@Before
public void setup() {
Field httpServletRequest = exceptionMapper.getClass().getDeclaredField("httpServletRequest");
httpServletRequest.setAccessible(true);
httpServletRequest.set(exceptionMapper, mockHttpServletRequest);
Field httpServletResponse = exceptionMapper.getClass().getDeclaredField("httpServletResponse");
httpServletResponse.setAccessible(true);
httpServletResponse.set(exceptionMapper, mockHttpServletResponse);
}
}
然后在测试中,我可以将两个@Mocked
值设置为正常值
我不是反射方面的专家,所以这可能不是最好/最有效的方法,但它已经足够满足我的需要了。您是否使用
-javaagent
参数来初始化JMockit?@Rogério-并非故意。我只是在IntelliJ中以普通JUnit测试的方式运行这些测试,在Maven POM中我看不到任何对-javaagent
的引用。我应该使用它吗?如果你使用最新版本的JMockit,那么是的。
public class MyExceptionMapperTest {
@Mocked
private HttpServletRequest mockHttpServletRequest;
@Mocked
private HttpServletResponse mockHttpServletResponse;
private MyExceptionMapper exceptionMapper = new MyExceptionMapper();
@Before
public void setup() {
Field httpServletRequest = exceptionMapper.getClass().getDeclaredField("httpServletRequest");
httpServletRequest.setAccessible(true);
httpServletRequest.set(exceptionMapper, mockHttpServletRequest);
Field httpServletResponse = exceptionMapper.getClass().getDeclaredField("httpServletResponse");
httpServletResponse.setAccessible(true);
httpServletResponse.set(exceptionMapper, mockHttpServletResponse);
}
}