You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按需跳过@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:31:13