如何从 JUnit 5 测试中的请求中从 InvocableBuilder 对象获取标头

问题描述 投票:0回答:2

我想测试一种在对外部公共 API 的请求中添加标头的方法。

方法如下:

@Service
@AllArgsConstructor
class ProductsFacadeImpl implements ProductsFacade {

  private NutritionixHeader nutritionixHeader;

  @Override
  public Invocation.Builder 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;
  }
}

用于编辑目的的新版本方法:

  @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 测试中,我想检查我的标头是否包含公共 API 所需的两个对象。它是:

"x-app-id"

"x-app-key"

我的测试如下:

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

    given(nutritionixHeader.getNutritionixAppId()).willReturn(appId);
    given(nutritionixHeader.getNutritionixAppKey()).willReturn(appKey);

    Invocation.Builder builder = productsFacade.prepareHeaderForApiCall(query);

    builder.get();

    assertEquals(appId, builder.get().getHeaders().entrySet().stream().filter(entry -> entry.getKey().equals("x-app-id")).map(Map.Entry::getValue).findFirst().orElse(null));

  }

问题在于方法

getHeaders()

在我的流中不包含我添加的标题,它看起来像:

我想知道如何获取标头参数对象,这些对象作为标头对象放置在 requestContext 对象中,如下所示:

编辑:

我在 IntelliJ 中使用调试器和评估表达式发现了一件有趣的事情,即:

通过上面的表达式,我可以找到我添加的两个标头,但我无法在代码中使用相同的表达式。

如果您提出有关如何通过从 requestContext 对象获取 headers 对象来实现目标的建议,我将不胜感激。

java junit request jersey request-headers
2个回答
0
投票

您可以尝试以下方法:

1)

builder.get().getMetadata()

2)

builder.get().getStringHeaders()

3) 如果前两个失败

((ClientResponse)ReflectionTestUtils.getField(builder.get(), "context")).getHeaders()


0
投票
Field requestContextField = JerseyInvocation.Builder.class.getDeclaredField("requestContext");
requestContextField.setAccessible(true);
ClientRequest clientRequest = (ClientRequest)requestContextField.get(invocationBuilder);
MultivaluedMap<String, Object> actualHeaders = clientRequest.getHeaders();
© www.soinside.com 2019 - 2024. All rights reserved.