0

我有一个 Spring Boot 应用程序,我正在使用 Pact-JVM 编写合同测试。它是一个提供者。

我在 build.gradle 中添加了以下协议依赖项/配置:我正在使用 Java 11、Gradle 6.3

plugins {
    id 'au.com.dius.pact' version '4.1.6'
}
dependencies {
    testImplementation 'ch.qos.logback:logback-core:1.2.3'
    testImplementation 'ch.qos.logback:logback-classic:1.2.3'

    testImplementation 'au.com.dius.pact.provider:junit5:4.1.6'
}

这是我的验证测试:

@Provider("product")
@PactBroker(host = "localhost", scheme = "http", port = "9292")
class PactVerificationTest {

    @BeforeEach
    void setupTestTarget(PactVerificationContext context) {
        context.setTarget(new HttpTestTarget("localhost", 9002, "/"));
    }

    @TargetRequestFilter
    public void addAuthorizationHeadersStripContextPathRequestFilter(HttpRequest request) throws URISyntaxException {
        request.addHeader("USER_ID", "1231324123414");
        request.addHeader("AB_USER", "1231324123414");
        request.addHeader("AB_USERGROUP", "installtrial");

        String rawUri = request.getRequestLine().getUri();
        ((HttpRequestBase) request).setURI(new URI(rawUri.replaceFirst("/product/", "/")));
    }

    @TestTemplate
    @ExtendWith(PactVerificationInvocationContextProvider.class)
    void pactVerificationTestTemplate(PactVerificationContext context) {
        context.verifyInteraction();
    }

    @State("Given products available")
    public void testProductDetails() {

    }
}

我期望在 TargetRequestFilter 注释方法中添加的授权标头成为请求的一部分,但请求中缺少这些标头。你能帮我看看我在这里做错了什么吗?

另外,我正在寻找使用最新版本的 pact-jvm 的示例。我在 pact-jvm 提供的示例中找不到。

4

2 回答 2

0

Pact-JVM Slack 团队前来救援!

在 Pact-JVM + JUnit5 的情况下,可以在 @TestTemplate 注释方法本身中添加标头/请求操作 - https://docs.pact.io/implementation_guides/jvm/provider/junit5/#modifying-the-requests-在他们被发送之前

现在我的方法如下所示:

@TestTemplate
@ExtendWith(PactVerificationInvocationContextProvider.class)
void pactVerificationTestTemplate(PactVerificationContext context, HttpRequest request) {
    addAuthenticationHeaders(request);
    context.verifyInteraction();
}
于 2020-07-31T07:18:54.977 回答
0

如果您想动态更改授权标头,我们就是这样做的。在这里,我们以教师身份开始测试,并在需要时调用该方法用学生令牌覆盖访问令牌。

@Provider(PACT_PROVIDER)
@Consumer(PACT_CONSUMER)
@PactBroker(host = BROKER_PACT_URL)
public class PactProviderGcTest {

@TestTemplate
@ExtendWith(PactVerificationInvocationContextProvider.class)
void pactTestTemplate(PactVerificationContext context, HttpRequest request) {

    request.addHeader("Authorization", "Bearer " + accessToken);

    context.verifyInteraction();
}

@BeforeAll
public static void setUp() throws JSONException {
  accessToken =  getTeacherAccessToken();
}

@BeforeEach
void before(PactVerificationContext context) {
    context.setTarget(new HttpsTestTarget(BASE_PACT_URL, 443, "/"));
}

@State("A request to retrieve google courses as a teacher")
void sampleState() {}

@State("A request to retrieve a google course as a teacher")
void sampleState1() {}

@State("A request to turn in a submission as a student")
void sampleState2() throws JSONException {
    accessToken = getAccessTokenStudent();
}

}

// 获取令牌方法

public static String getTeacherAccessToken() {

    accessToken = retrieveTokenFor("Teacher");

    return accessToken;
}

public static String getAccessTokenStudent() throws JSONException {

   accessToken = retrieveTokenFor("Student");

   return accessToken;
}
于 2021-11-08T15:51:43.233 回答