如何按需跳过@SpringBootTest应用初始化?适配本地与远程测试
解决@SpringBootTest在远程测试场景下重复启动应用的问题
方案1:拆分测试类(推荐,逻辑清晰)
把本地和远程测试拆分为两个独立类,分别适配不同场景:
本地测试类(启动Spring Boot应用)
@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class LocalRestTest extends RestTestBase { @LocalServerPort private int port; @Before public void setUp() { RestAssured.baseURI = "http://localhost:" + port; } }
远程测试类(不启动应用,仅读取配置)
@RunWith(SpringRunner.class) @ContextConfiguration(classes = RemoteTestConfig.class) public class RemoteRestTest extends RestTestBase { @Autowired private String host; @Before public void setUp() { RestAssured.baseURI = host; } } // 仅加载必要配置的远程测试配置类 @TestConfiguration @PropertySource("classpath:application.properties") class RemoteTestConfig { @Value("${service.host}") private String host; @Bean public String hostBean() { return host; } }
通用测试逻辑基类
抽离重复的测试方法,避免代码冗余:
abstract class RestTestBase { @Test public void test() { RestAssured.get("/test").then().assertThat().statusCode(HttpStatus.OK.value()); } }
方案2:单个测试类中通过条件控制上下文加载
利用@EnabledIf注解根据配置决定是否启动Spring Boot应用,适合不想拆分类的场景:
@RunWith(SpringRunner.class) // 仅当service.host未配置时,启动Spring Boot应用 @EnabledIf(expression = "#{environment.getProperty('service.host') == null}", loadContext = true) @SpringBootTest // 当service.host已配置时,不加载Spring上下文 @EnabledIf(expression = "#{environment.getProperty('service.host') != null}", loadContext = false) public class RestTest { private String host; @Before public void setUp() { // 优先读取配置或系统参数,未配置则启动本地应用获取地址 host = Optional.ofNullable(System.getProperty("service.host")) .orElseGet(() -> { try (ConfigurableApplicationContext context = SpringApplication.run(YourApplication.class)) { return "http://localhost:" + context.getEnvironment().getProperty("server.port", "8080"); } }); RestAssured.baseURI = host; } @Test public void test() { RestAssured.get("/test").then().assertThat().statusCode(HttpStatus.OK.value()); } }
方案3:完全脱离Spring上下文(最简远程测试)
如果远程测试不需要读取Spring配置,直接通过系统参数传入host,可去掉所有Spring相关注解:
public class RestTest { @Before public void setUp() { // 优先读取系统参数,默认使用本地地址 String host = System.getProperty("service.host", "http://localhost:8080"); RestAssured.baseURI = host; } @Test public void test() { RestAssured.get("/test").then().assertThat().statusCode(HttpStatus.OK.value()); } }
远程测试时只需通过命令行传入参数:
mvn test -Dservice.host=http://remote-host:8080
内容的提问来源于stack exchange,提问作者EasyCode
相关产品推荐
相关产品推荐

