将Spring-cloud-starter-sleuth依赖项添加到Spring-Boot App的部分Rest Doc测试失败

时间:2019-04-09 13:26:15

标签: spring-boot spring-webflow spring-cloud-sleuth spring-restdocs

我有一个Spring-Boot 2.1.4应用程序,具有用于Flux控制器的n-RestDoc测试。

环境:

  • Spring-Boot 2.1.4
  • Junit 5.4.0
  • spring-restdocs-webtestclient
  • spring-webflux

如果我将spring-clout-starter-sleuth依赖项添加到应用程序,则某些doc测试在maven构建中失败。 重要的是,在不同的环境中,不同的测试类将失败:

java.lang.IllegalStateException: org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext@6516dd09 has been closed already ....

如果使用maven -Dtest=OptDocTest运行失败测试,​​则该测试将不会失败,并且即使指定了一组(并非全部)测试,也不会失败。

依赖性

<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-sleuth</artifactId>
     <version>2.1.1.RELEASE</version>
     <exclusions> <!-- exclude old spring versions -->
          <exclusion>
               <artifactId>*</artifactId>
               <groupId> org.springframework.security</groupId>
           </exclusion>
           <exclusion>
                <artifactId>spring-aop</artifactId>
                <groupId>org.springframework</groupId>
            </exclusion>
      </exclusions>
</dependency>
<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
</dependency>

所有测试看起来都很相似

@ExtendWith({ RestDocumentationExtension.class, SpringExtension.class })
@AutoConfigureRestDocs("target/generated-snippets")
@SpringBootTest(//webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, 
        classes = { ArchimedesApplication.class })
class OptControllerDocTest {

   @MockBean
   private SrkConnector srkTConnector;

   @Autowired
   private ApplicationContext context;

   private WebTestClient webTestClient;

   @BeforeEach
   void beforeEach(RestDocumentationContextProvider restDocumentation) {
        this.webTestClient = WebTestClient.bindToApplicationContext(context)
              .configureClient() 
              .filter(documentationConfiguration(restDocumentation))
              .build();

   }

   @Test
   void documentationTest() throws IOException {

        this.webTestClient.post()
            .uri("/opt")
            .contentType(MediaType.APPLICATION_JSON)
            .body(BodyInserters.fromObject(testRequest))
            .exchange()
            .expectStatus()  // here the error occur
            .isOk()
            .expectBody() ...
    }

使用正在运行的启动应用程序的所有IT测试均正常运行。

我不知道出了什么问题以及为什么AnnotationConfigReactiveWebServerApplicationContext被关闭了。

在Windows框上,具有助焊剂含量的控制器的其余文档测试在具有单声道内容的控制器的linux框中失败。

3 个答案:

答案 0 :(得分:0)

如果我在版本2.1.0中退回到spring-cloud-starter-sleuth,请解决。释放并删除所有排除项。

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-sleuth</artifactId>
      <version>2.1.0.RELEASE</version>
</dependency>

如果我使用2.1.1.RELEASE版本,则会发生错误。

答案 1 :(得分:0)

我也遇到了同样的问题。我通过将Sleuth降级到2.0.3.RELEASE(2.1.0也不适合我)解决了这个问题。我的Spring Boot版本是2.0.5.RELEASE
如果仍然无法使用2.0.3,请尝试从mvn repo降级更多版本

答案 2 :(得分:0)

此问题已作为sleuth github问题列表github.com/spring-cloud/spring-cloud-sleuth/issues/1450

中的一个错误提出。

如果您和我一样在junit测试方面遇到这种情况,那么我可以通过删除项目中每个junit测试类中的所有注释@DirtiesContext来解决此问题。