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

在 JBoss 容器中使用 RestEasy 时,我有一个带 注释的 ,它可以访问 和 通过注释,如下所示:ExceptionMapper@ProviderHttpServletRequestHttpServletResponse@Context


@Provider

public 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

希望我只是错过了一些非常明显的东西?


慕哥6287543
浏览 107回答 1
1回答

慕桂英4014372

在没有更好的答案的情况下,我最终在测试中使用反射来注入这两个属性的值。不理想,但它的工作原理:public class MyExceptionMapperTest {&nbsp; @Mocked&nbsp; private HttpServletRequest mockHttpServletRequest;&nbsp; @Mocked&nbsp; private HttpServletResponse mockHttpServletResponse;&nbsp; private MyExceptionMapper exceptionMapper = new MyExceptionMapper();&nbsp; @Before&nbsp; public void setup() {&nbsp; &nbsp; Field httpServletRequest = exceptionMapper.getClass().getDeclaredField("httpServletRequest");&nbsp; &nbsp; httpServletRequest.setAccessible(true);&nbsp; &nbsp; httpServletRequest.set(exceptionMapper, mockHttpServletRequest);&nbsp; &nbsp; Field httpServletResponse = exceptionMapper.getClass().getDeclaredField("httpServletResponse");&nbsp; &nbsp; httpServletResponse.setAccessible(true);&nbsp; &nbsp; httpServletResponse.set(exceptionMapper, mockHttpServletResponse);&nbsp; }}然后,在我的测试中,我可以像往常一样对这两个值设置期望和验证。@Mocked我不是反思方面的专家,所以这可能不是最好/最有效的方法,但它足以满足我的需求。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java