亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將帶@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 關注
  • 101 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號