解析已在弹簧启动测试定义的端口中使用的端口
我有一个 Spring Boot 应用程序,它启动并执行一个类,该类侦听 Application Ready 事件以调用外部服务来获取一些数据,然后使用该数据将一些规则推送到类路径以执行。对于本地测试,我们模拟了应用程序中的外部服务,该服务在应用程序启动期间工作正常。
问题是在测试应用程序时,通过在以下两个平台上使用弹簧启动测试注释和嵌入式码头容器来运行它:
- 随机端口
- 定义的端口
对于 RANDOM PORT,在应用程序启动时,它会从定义端口的属性文件中获取模拟服务的 url,并且不知道嵌入式容器在何处运行,因为它是随机拾取的,因此无法给出响应。
对于 DEFINED PORT,对于第一个测试用例文件,它成功运行,但在拾取下一个文件时,它失败,表示该端口已在使用中。
测试用例在逻辑上分区为多个文件,需要在容器开始加载规则之前调用外部服务。
在使用定义的端口的情况下,如何在测试文件之间共享嵌入式容器,或者在测试用例执行期间启动时重构应用程序代码以获取随机端口。
任何帮助将不胜感激。
应用程序启动代码 :
@Component
public class ApplicationStartup implements ApplicationListener<ApplicationReadyEvent> {
@Autowired
private SomeService someService;
@Override
public void onApplicationEvent(ApplicationReadyEvent arg0) {
try {
someService.callExternalServiceAndLoadData();
}
catch (Execption e) {}
}
}
测试代码注释:测试 1
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@TestPropertySource("classpath:test-application.properties")
public class Test1 {
@Autowired
private TestRestTemplate restTemplate;
@Test
public void tc1() throws IOException {.....}
测试代码注释:Test2
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@TestPropertySource("classpath:test-application.properties")
public class Test2 {
@Autowired
private TestRestTemplate restTemplate;
@Test
public void tc1() throws IOException {.....}