AssertJ Swagger测试坚持执行

时间:2017-05-19 15:02:49

标签: spring-mvc spring-boot swagger springfox assertj

我正在尝试在REST API开发(Swagger Web应用程序)中采用Spring Boot。基于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,因为看起来我做错了什么?

1 个答案:

答案 0 :(得分:1)

我设法运行了AssertJSwaggerConsumerDrivenTest!我想我以前从未如此高兴看到很多红色测试结果=)无论如何,它比永远运行测试更好。

AssertJ-Swagger的readme有点过时了。这是我改变以解决问题的方法。

测试代码:

@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选项中。