为了账号安全,请及时绑定邮箱和手机立即绑定

如何将带@Context注释的字段注入到 RestEasy @Provider中?

如何将带@Context注释的字段注入到 RestEasy @Provider中?

慕哥6287543 2022-09-28 15:49:08
在 JBoss 容器中使用 RestEasy 时,我有一个带 注释的 ,它可以访问 和 通过注释,如下所示:ExceptionMapper@ProviderHttpServletRequestHttpServletResponse@Context@Providerpublic class MyExceptionMapper implements ExceptionMapper<Throwable> {  @Context  private HttpServletRequest httpServletRequest;  @Context  private HttpServletResponse httpServletResponse;  @Override  public Response toResponse(final Throwable exception) {    ...    return response;  }}我是ResteEasy的新手,来自Spring背景,所以天真地认为我能够注入这两个字段并在单元测试中模拟它们,但这似乎比我预期的要难!如果模拟框架是相关的,我正在使用JMockit,并且也是新手。到目前为止,我已经能够将我对莫基托的知识应用到它上面,并取得了很大的成功。通过搜索这个主题,我没有找到太多,除了很多在我的单元测试中运行嵌入式容器的建议。我并不完全反对这一点,但是当我只是试图编写一个简单的单元测试时,这感觉有点过分了。我在测试中尝试了几件事,最近一次是这样的:public class MyExceptionMapperTest {  @Injectable  private HttpServletRequest httpServletRequest;  @Injectable  private HttpServletResponse httpServletResponse;  @Tested  private MyExceptionMapper exceptionMapper;  @Test  public void test() {    exceptionMapper.toResponse(new Throwable());  }}但是这导致我第一次提到其中一个字段,它告诉我它们没有被注入。NullPointerExceptionMyExceptionMapper@Context我也尝试过:使用 而不是@Mocked@Injectable;直接实例化有和没有注释;MyExceptionMapper@Tested在我的测试中创建;和Expectations上述各项的排列在所有情况下,带注释的字段都是 。@Contextnull希望我只是错过了一些非常明显的东西?
查看完整描述

1 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

在没有更好的答案的情况下,我最终在测试中使用反射来注入这两个属性的值。不理想,但它的工作原理:


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


我不是反思方面的专家,所以这可能不是最好/最有效的方法,但它足以满足我的需求。


查看完整回答
反对 回复 2022-09-28
  • 1 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号