在创建协议验证测试时,我使用
HttpsTestTarget
方法。但问题是我的服务需要在调用中发送身份验证令牌。我们如何运行这个?请指教。
详细信息:使用 Java、Pact 和 Quarkus 扩展的项目(io.quarkiverse.pact:quarkus-pact-provider 和 io.quarkiverse.pact:quarkus-pact-consumer)。
下面是我的卷曲:
curl --location 'https://gateway.production.xpto.io/xpto/v2/xpto?attribute=%23xpto_client' \
--header 'Authorization: Bearer 3rdcD=V8KoW!eJaPjWx04lhuVUqXFyr2Bz-HjANr7Fy9eUzOW!7JJXeVwPe6NTSAlPxxn4C!qXzsqz!UzSrj/gH2o-BL=S?IsbMrb/zG00pjOWm7U=08PYz5UPko1JttfuI!v6rRH4P8fsJ-M6E0kR0Ds7tsqbRbjGGt8NsdzO4VPG1/U3uIYZ7IG/yWG8-1tUyq8V4DPmwtmxM/5CieFaPHhUJyRyjR!24K-7m4FGNd??gCr!t57JTvW2vrjEpj'
以下是我的验证测试:
package com.company.pact.provider;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.TestTemplate;
import org.junit.jupiter.api.extension.ExtendWith;
import au.com.dius.pact.provider.junit5.HttpsTestTarget;
import au.com.dius.pact.provider.junit5.PactVerificationContext;
import au.com.dius.pact.provider.junit5.PactVerificationInvocationContextProvider;
import au.com.dius.pact.provider.junitsupport.Provider;
import au.com.dius.pact.provider.junitsupport.State;
import au.com.dius.pact.provider.junitsupport.loader.PactBroker;
import io.quarkus.test.junit.QuarkusTest;
@QuarkusTest
@Provider("XPTOProvider")
@PactBroker(host = "localhost", port = "9292")
public class XPTOProviderContractTest {
@BeforeEach
void beforeEach(PactVerificationContext context) {
context.setTarget(new HttpsTestTarget("gateway.production.xpto.io", 443, "/xpto/v2/xpto?attribute=%23xpto_client"));
}
@TestTemplate
@ExtendWith(PactVerificationInvocationContextProvider.class)
void pactVerificationTestTemplate(PactVerificationContext context) {
context.verifyInteraction();
}
@State("test GET")
public void testGet() {
System.out.println("test GET");
}
}
我们通过参考此链接中提供的文档成功解决了该问题。
为了解决这个问题,我们需要修改pactVerificationTestTemplate如下:
import org.apache.hc.core5.http.HttpRequest;
@TestTemplate
@ExtendWith(PactVerificationInvocationContextProvider.class)
void pactVerificationTestTemplate(PactVerificationContext context, HttpRequest request) throws Exception {
request.addHeader("Authorization", getAccessToken());
context.verifyInteraction();
}
另外,不要忘记添加导入语句:
import org.apache.hc.core5.http.HttpRequest;
此修改允许我们在发送请求之前对其进行调整,这对于解决我们的问题至关重要。