小编ahj*_*ish的帖子

解决Spring启动测试中已使用的端口DEFINED PORT

我有一个Spring启动应用程序,它启动并执行一个类,它监听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) {}
    }
 }
Run Code Online (Sandbox Code Playgroud)

测试代码注释: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 {.....}
Run Code Online (Sandbox Code Playgroud)

测试代码注释:Test2

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment …
Run Code Online (Sandbox Code Playgroud)

java integration-testing spring-boot spring-boot-test

9
推荐指数
2
解决办法
9315
查看次数