首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从junit测试生成和Pact.io pact?

如何从junit测试生成和Pact.io pact?
EN

Stack Overflow用户
提问于 2019-12-02 12:55:42
回答 1查看 456关注 0票数 0

使用spring和mockmvc,我有以下@beforeEach方法的测试类:

代码语言:javascript
复制
@BeforeEach
void setUp(WebApplicationContext context,
           RestDocumentationContextProvider restDocumentation) {
    MockMvcRestDocumentationConfigurer configurer = documentationConfiguration(restDocumentation);
    configurer.operationPreprocessors()
            .withRequestDefaults(prettyPrint())
            .withResponseDefaults(prettyPrint());
    configurer.snippets()
            .withDefaults(
                    httpRequest(),
                    httpResponse()
            );
    this.mockMvc = MockMvcBuilders.webAppContextSetup(context)
            .apply(configurer)
            .build();

以及以下测试方法:

代码语言:javascript
复制
@Test
void createAdminHttpRequest() throws Exception {
    var adminDTO = HandlerTestObjectGenerator.createFixedAdminDTO();

    mockMvc.perform(
            RestDocumentationRequestBuilders
                    .post("/api/admins")
                    .content(objectMapper.writeValueAsString(adminDTO))
                    .contentType(MediaType.APPLICATION_JSON_UTF8)
    ).andExpect(status().isCreated())
            .andDo(document("create-admin",
                    preprocessRequest(),
                    preprocessResponse(),
                    requestFields(
                            usernameFieldDescriptor,
                            passwordFieldDescriptor,
                            rolesFieldDescriptor
                    ),
                    responseFields(
                            admin_adminIdFieldDescriptor,
                            admin_usernameFieldDescriptor,
                            admin_rolesFieldDescriptor
                    ),
                    SpringCloudContractRestDocs.dslContract(),
            ));
}

这个测试运行良好,并生成spring文档和groovy契约。

但是对于前端(react)测试,我需要生成独立于框架的Pact.io协议。

问题

那么,我的问题是,是否可以使用单一的pact.io方法生成spring文档和@Test协议?

我的研究

到目前为止,我发现的是使用自己的rest构建器从@Pact注释的方法生成pacts。

另外,我发现了这样的对话:https://gitter.im/spring-cloud/spring-cloud-contract/archives/2018/08/06和我正在尝试实现自己的maven插件来将groovy契约转换为pact,但是BodyConverter类中似乎出现了错误,我得到了以下异常:

代码语言:javascript
复制
java.lang.UnsupportedOperationException: use the array(String name) form
at au.com.dius.pact.consumer.dsl.PactDslJsonBody.array(PactDslJsonBody.java:673)

我的maven插件代码示例:

Inicialization:

代码语言:javascript
复制
private PactContractConverter pactContractConverter = new PactContractConverter();
private ContractVerifierDslConverter contractDslConverter = new ContractVerifierDslConverter();

改划:

代码语言:javascript
复制
private void processFiles(List<File> contractFiles) throws Exception {
        for(File file : contractFiles) {
            logger.info("Processing " + file.getAbsolutePath());
            Collection<Contract> contracts = contractDslConverter.convertFrom(file);
            Collection<Pact> pacts = pactContractConverter.convertTo(contracts);

            String jsonPacts = mapper.writeValueAsString(pactContractConverter.store(pacts));
            File pactsFile = new File(outputDir, file.getName() + "_pact.json");
            FileUtils.writeByteArrayToFile(pactsFile, jsonPacts.getBytes());
            logger.info("Generated pact file: " + pactsFile.getAbsolutePath());
        }
    }

但是我得到了上面提到的例外。有一个对方法的直接调用,它抛出UnsupportedOperationException。我找到了其他方法array(String name),但这似乎不是从转换器代码中调用的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-02 13:28:11

让我们从这句话开始:

但是对于前端(

)测试,我需要生成Pact.io契约,它是独立于框架的。

您可以在polyglot世界中使用Spring契约。只需使用Docker (https://spring.io/blog/2018/02/13/spring-cloud-contract-in-a-polyglot-world)和https://cloud.spring.io/spring-cloud-static/spring-cloud-contract/2.2.0.RELEASE/reference/html/docker-project.html

回到你的问题

那么,我的问题是,是否可以使用单一@Test方法同时生成spring文档和pact.io协议?

让我们用另一种方式来做..。既然您已经拥有了DSL,我想您也希望得到契约文件。如果您查看本节(https://cloud.spring.io/spring-cloud-static/spring-cloud-contract/2.2.0.RELEASE/reference/html/howto.html#how-to-generate-pact-from-scc)下的文档,您将看到问题的确切答案。添加一个插件就足够了,在您的测试生成之后,DSL将把这些DSL转换成其他的东西,例如契约文件。

使用Maven插件的示例

代码语言:javascript
复制
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.6.0</version>
    <executions>
        <execution>
            <id>convert-dsl-to-pact</id>
            <phase>process-test-classes</phase>
            <configuration>
                <classpathScope>test</classpathScope>
                <mainClass>
                    org.springframework.cloud.contract.verifier.util.ToFileContractsTransformer
                </mainClass>
                <arguments>
                    <argument>
                        org.springframework.cloud.contract.verifier.spec.pact.PactContractConverter
                    </argument>
                    <argument>${project.basedir}/target/pacts</argument>
                    <argument>
                        ${project.basedir}/src/test/resources/contracts
                    </argument>
                </arguments>
            </configuration>
            <goals>
                <goal>java</goal>
            </goals>
        </execution>
    </executions>
</plugin>

如果修改${project.basedir}/src/test/resources/contracts以指向从REST文档测试中转储DSL的位置,则会将PACT文件转储到${project.basedir}/target/pacts。下面有一个类似的Gradle示例

代码语言:javascript
复制
task convertContracts(type: JavaExec) {
    main = "org.springframework.cloud.contract.verifier.util.ToFileContractsTransformer"
    classpath = sourceSets.test.compileClasspath
    args("org.springframework.cloud.contract.verifier.spec.pact.PactContractConverter",
            "${project.rootDir}/build/pacts", "${project.rootDir}/src/test/resources/contracts")
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59139365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档