开发者社区 问答 正文

从@WebFluxTest迁移到@SpringBootTest后,集成测试拒绝连接

我做了从Spring Boot反应式到mvc的迁移。我迁移了控制器,现在尝试迁移集成测试。

控制器的测试是这样注释的,如果我运行测试,它将起作用。

@RunWith(SpringRunner.class)
@WebFluxTest
public class MyIntegrationTest {
}

然后我WebFluxTest像这样替换注释

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWebTestClient
public class MyIntegrationTest {
}

如果我运行此测试,我会reactor.core.Exceptions$ReactiveException: io.netty.channel.AbstractChannel$AnnotatedConnectException: finishConnect(..) failed: Connection refused: localhost/127.0.0.1:8080。任何想法如何解决?

展开
收起
垚tutu 2019-12-26 18:23:28 1096 分享 版权
阿里云 AI 助理回答

遇到 Connection refused 错误通常意味着你的应用没有正确启动或者Web服务器没有在预期的端口上监听。考虑到你从Spring WebFlux迁移到了Spring MVC,这里有几个可能的原因和解决方法:

  1. 确保服务正常启动:首先确认你的Spring Boot应用能够独立运行并且可以正常访问。可以通过直接运行主类或使用命令行mvn spring-boot:run/gradlew bootRun来验证。

  2. 检查端口号配置:错误信息中提到的是8080端口,确认你的Spring Boot应用实际使用的端口是否也是8080。有时候,特别是当有多个服务运行在同一台机器上时,端口冲突是很常见的问题。你可以通过在application.propertiesapplication.yml中设置server.port=8080(或你想要的任何其他端口)来指定端口,并确保测试中的端口与之匹配。

  3. 调整@SpringBootTest配置:你已经设置了@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT),这意味着Spring Boot会随机选择一个可用端口来启动嵌入式服务器。如果你希望固定端口,可以改为@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)并确保定义了正确的端口。但既然你遇到了连接拒绝,保持RANDOM_PORT并获取实际分配的端口可能是更好的选择。

  4. 使用WebTestClient正确地初始化:由于你使用了@AutoConfigureWebTestClient,你应该能够在测试类中注入WebTestClient并使用它来发起请求,而不是直接尝试连接到特定端口。确保你这样使用WebTestClient来进行测试:

    @Autowired
    private WebTestClient webTestClient;
    
    // 在测试方法中使用webTestClient
    @Test
    public void testExampleEndpoint() {
       webTestClient.get().uri("/your-endpoint")
                    .exchange()
                    .expectStatus().isOk()
                    // 更多断言...
    }
    
  5. 查看日志:仔细检查Spring Boot启动时的日志输出,看是否有任何异常或警告提示,这可能会提供关于为什么应用没有成功启动或监听端口的线索。

  6. 网络问题:虽然不太常见,但也要确保本地网络环境没有阻止连接到localhost上的端口。

如果以上步骤都不能解决问题,可能需要更详细的错误日志或了解项目具体配置来进一步诊断。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答