0

我正在尝试在 REST API 开发(Spring Boot Web 应用程序)中采用Swagger 。基于 swagger 规范的 API 记录过程和代码生成效果很好,现在我遇到了使用assertj-swaggerSpringFox库编写集成测试的问题。

关于这些库的几句话。Springfox 通过在运行时检查应用程序一次以根据 Spring 配置、类结构和各种编译时 Java 注释来推断 API 语义。swagger-assertj 测试库应该将合约优先的 Swagger YAML 文件与 SpringFox 生成的代码优先的 Swagger JSON 进行比较。对于消费者驱动的合约测试,如果 assertj-swagger 发现实现中缺少消费者规范所需的资源、方法、模型或属性,则测试失败。

我的测试看起来像(测试代码取自GitHub示例):

@RunWith(SpringRunner.class)
@SpringBootTest
public class AssertJSwaggerConsumerDrivenTest {

    @Test
    public void validateThatImplementationSatisfiesConsumerSpecification() {
        String designFirstSwagger = AssertJSwaggerConsumerDrivenTest.class.getResource("/swagger.yaml").getPath();
        SwaggerAssertions.assertThat("http://localhost:8080/v2/api-docs")
                .satisfiesContract(designFirstSwagger);
    }

}

问题是该测试执行了很长时间并且似乎卡住了,因为在此行之后我没有看到任何日志输出:

INFO c.s.e.AssertJSwaggerConsumerDrivenTest   : Started AssertJSwaggerConsumerDrivenTest in 24.03 seconds (JVM running for 26.774)
  • 我确定 SpringFox 正在工作,因为我GET http://localhost:8080/v2/api-docs在浏览器中打开后看到了 JSON。
  • 运行测试时我没有编译时或构建时错误,导致 Maven 解析依赖项并且 Spring Boot 上下文已成功初始化。

有没有人有使用 assertj-swagger 的经验,因为看起来我做错了什么?

4

1 回答 1

1

我设法运行了我的AssertJSwaggerConsumerDrivenTest!我想我以前从来没有这么高兴过看到很多红色的测试结果=)无论如何这比永远运行测试要好。

AssertJ-Swagger 的自述文件有点过时了。这是我为解决问题所做的更改。

测试代码:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class AssertJSwaggerConsumerDrivenTest {

    @LocalServerPort
    int randomPort;

    @Test
    public void validateThatImplementationSatisfiesConsumerSpecification() {
        File designFirstSwagger = new File(AssertJSwaggerConsumerDrivenTest.class.getResource("/swagger.yaml").getFile());
        SwaggerAssertions.assertThat("http://localhost:" + randomPort + "/v2/api-docs")
                .satisfiesContract(designFirstSwagger.getAbsolutePath());
    }    
}

pom.xml:

<dependency>
    <groupId>io.github.robwin</groupId>
    <artifactId>assertj-swagger</artifactId>
    <version>0.6.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>3.8.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-parser</artifactId>
    <version>1.0.30</version>
    <scope>test</scope>
</dependency>

我也得到了java.lang.OutOfMemoryError: Permgen space,所以我不得不将它添加-XX:MaxPermSize=384m到 VM 选项中。

于 2017-05-19T16:05:27.853 回答