我有一个 Spring Boot 应用程序,它启动并执行一个类,该类侦听Application Ready 事件以调用外部服务以获取一些数据,然后使用该数据将一些规则推送到类路径以执行。对于本地测试,我们在应用程序中模拟了外部服务,该服务在应用程序启动期间运行良好。
问题是在测试应用程序时使用spring boot 测试注释和嵌入式码头容器运行它:
- 随机端口
- 定义端口
在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) {}
}
}
测试代码注释:Test1
@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 {.....}