Java 如何在JUnit5测试中从请求中获取InvocationBuilder对象的头

Java 如何在JUnit5测试中从请求中获取InvocationBuilder对象的头,java,junit,request,jersey,request-headers,Java,Junit,Request,Jersey,Request Headers,我想测试一个方法,该方法将请求中的头添加到外部公共API 该方法如下所示: @Service @AllArgsConstructor class ProductsFacadeImpl implements ProductsFacade { private NutritionixHeader nutritionixHeader; @Override public Invocation.Builder prepareHeaderForApiCall(String query) {

我想测试一个方法,该方法将请求中的头添加到外部公共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;
  }
}
@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));

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

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

"x-app-id"

我的测试看起来像:

@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;
  }
}
@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()
在我的流中不包含我添加的标题,它看起来像:

@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;
  }
}
@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));

  }

我想知道如何获得header params对象,这些对象作为header对象放置在requestContext对象中,如下所示:

编辑:

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

使用上面的表达式,我可以找到我添加的两个头,但我不能在代码中使用相同的表达式


如果有人建议如何通过从requestContext对象获取headers对象来实现目标,我将不胜感激

您可以尝试以下操作:

1)
builder.get().getMetadata()

2)
builder.get().getStringHeaders()

3) 如果前两次失败
((ClientResponse)ReflectionTestUtils.getField(builder.get(),“context”)).getHeaders()

您可以尝试以下操作:

1)
builder.get().getMetadata()

2)
builder.get().getStringHeaders()

3) 如果前两次失败
((ClientResponse)ReflectionTestUtils.getField(builder.get(),“context”)).getHeaders()

由于这两个方法基于一个方法getHeaders(),因此没有带来理想的效果。在第一个屏幕上,我们可以看到在使用getHeaders()、getMetadata()或getStringHeaders()之后,x-app-id和x-app-key不存在。由于这两个方法基于一个方法getHeaders(),因此没有带来理想的效果。在第一个屏幕上,我们可以看到在使用getHeaders()、getMetadata()或getStringHeaders()之后,x-app-id和x-app-key不存在。