我正在尝试在REST API开发(Swagger Web应用程序)中采用Spring Boot。基于swagger规范的API文档编制过程和代码生成工作良好,现在我遇到了使用assertj-swagger和SpringFox库编写集成测试的问题。
关于这些库的一些小词。 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)
GET http://localhost:8080/v2/api-docs
后看到了JSON。 有没有人使用assertj-swagger,因为看起来我做错了什么?
答案 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选项中。