【问题标题】:JerseyInvocation expression not available in a class but reachable from Evaluate expression in IntelliJ debuggerJerseyInvocation 表达式在类中不可用,但可从 IntelliJ 调试器中的 Evaluate 表达式访问
【发布时间】:2019-09-09 17:57:33
【问题描述】:

我对 javax 包中的调用接口有一个奇怪的问题。即,我想测试我添加的标头参数以获取与公共 API 建立连接的请求。我负责向我的请求添加标头的方法如下所示:

@Service
@AllArgsConstructor
class ProductFacadeImpl implements ProductFacade {

  private NutritionixHeader nutritionixHeader;

  @Override
  public Invocation prepareHeaderForApiCall(String query) {
    Client client = ClientBuilder.newClient();
    WebTarget webTarget =
        client.target("https://trackapi.nutritionix.com/v2/search/instant?query=" + query);
    Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON_VALUE);
    invocationBuilder.header("x-app-id", nutritionixHeader.getNutritionixAppId());
    invocationBuilder.header("x-app-key", nutritionixHeader.getNutritionixAppKey());
    return invocationBuilder.buildGet();
  }
}

使用 JUnit 5 的测试如下所示:

@ExtendWith(MockitoExtension.class)
@MockitoSettings(strictness = Strictness.LENIENT)
class ProductsFacadeImplTest {

  @Mock
  private NutritionixHeader nutritionixHeader;

  private ProductFacadeImpl productsFacade;

  @BeforeEach
  void init() {
    productsFacade = new ProductFacadeImpl(nutritionixHeader);
  }

  @Test
  void prepareHeaderForApiCall() {
    var query = "query";

    given(nutritionixHeader.getNutritionixAppId()).willReturn(x-app-id-param);
    given(nutritionixHeader.getNutritionixAppKey()).willReturn(x-app-key-param);

    Invocation builder = productsFacade.prepareHeaderForApiCall(query);
    builder.invoke().getHeaders();

    then(nutritionixHeader).should(times(1)).getNutritionixAppId();

    assertEquals(builder.invoke().getStatus(), 200);
}

当我从一行中评估一个值时会出现问题:

builder.invoke().getHeaders();

在测试中使用 IntelliJ Expression Evaluator。

我收到如下评价:

我们可以看到没有类似的参数:

x-app-id

x-app-key

在标题中创建我的测试中的断言。

另一方面,当我们尝试对表达式求值时:

((JerseyInvocation) builder).requestContext.getHeaders()

我们收到如下评价:

这是来自标头的理想响应,但不幸的是,我无法使用此表达式

((JerseyInvocation) builder).requestContext.getHeaders()

在我的代码中,因为 IntelliJ 无法识别带有如下消息的部分 requestContext:

我有点困惑为什么我的调试器可以处理表达式的评估:

((JerseyInvocation) builder).requestContext.getHeaders()

但是当我想在测试中自己调用此方法时,无法在我的课堂上处理它。

我将不胜感激关于如何在我的测试中调用第二种方法以获得第二个屏幕上的响应的建议。

【问题讨论】:

    标签: java intellij-idea junit request jax-rs


    【解决方案1】:

    我猜在调试过程中评估私有成员是可能的。您的问题的解决方案是使用 request() 方法,该方法返回 requestContext 直接访问它。

    https://github.com/jersey/jersey/blob/master/core-client/src/main/java/org/glassfish/jersey/client/JerseyInvocation.java#L191

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-11
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多