Java Jersey调用表达式在类中不可用,但可从IntelliJ调试器中的求值表达式访问
我对javax包中的调用接口有一个奇怪的问题。也就是说,我想测试一个header参数,我正在添加该参数以获取与公共API建立连接的请求。我负责向请求添加标头的方法如下所示:Java Jersey调用表达式在类中不可用,但可从IntelliJ调试器中的求值表达式访问,java,intellij-idea,junit,request,jax-rs,Java,Intellij Idea,Junit,Request,Jax Rs,我对javax包中的调用接口有一个奇怪的问题。也就是说,我想测试一个header参数,我正在添加该参数以获取与公共API建立连接的请求。我负责向请求添加标头的方法如下所示: @Service @AllArgsConstructor class ProductFacadeImpl implements ProductFacade { private NutritionixHeader nutritionixHeader; @Override public Invocation pr
@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();
}
}
@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);
}
JUnit 5的测试如下所示:
@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();
}
}
@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表达式计算器的测试中
我收到的评估如下:
正如我们所看到的,没有如下参数:
x-app-id
及
在标题中创建我的测试中的断言
另一方面,当我们尝试计算表达式时:
((JerseyInvocation) builder).requestContext.getHeaders()
((JerseyInvocation) builder).requestContext.getHeaders()
我们收到的评估如下:
这是来自header的理想响应,但不幸的是,我不能使用这个表达式
((JerseyInvocation) builder).requestContext.getHeaders()
在我的代码中,因为IntelliJ无法识别带有如下消息的part requestContext:
我有点困惑,为什么我的调试器可以处理表达式的求值:
((JerseyInvocation) builder).requestContext.getHeaders()
((JerseyInvocation) builder).requestContext.getHeaders()
但是当我想在测试中自己调用这个方法时,我不能在我的类中处理它
如果有人建议我如何在测试中调用第二个方法以获得第二个屏幕上显示的响应,我将不胜感激。我猜在调试过程中可以评估私有成员。问题的解决方案是使用
request()
方法,该方法返回requestContext
直接访问它的方法