Java 如何在JUnit5测试中从请求中获取InvocationBuilder对象的头
我想测试一个方法,该方法将请求中的头添加到外部公共API 该方法如下所示: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) {
@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不存在。