如何为多个测试类仅初始化一次Spring应用上下文
这问题我太熟了!要让多个测试类共享同一个Spring应用上下文、不用重复加那些注解,最省心的办法就是用抽象基类统一管理配置,另外如果是Spring Boot项目还有更简洁的写法,下面给你一步步讲:
方法一:通用抽象基类(适配JUnit 4/5)
先搞一个抽象的基础测试类,把所有需要的Spring相关注解都堆在这个基类上,然后让你的Test_1和Test_2继承它就行。Spring本身会自动缓存上下文,只要上下文的配置参数一致,就只会初始化一次,所有子类直接共享。
示例代码
首先是抽象基类:
// JUnit 4用@RunWith(SpringRunner.class),JUnit 5换成@ExtendWith(SpringExtension.class) @RunWith(SpringRunner.class) @ContextConfiguration(classes = {Config.class}) public abstract class BaseSpringTest { // 把共享的依赖放在这里,子类可以直接用,不用重复@Autowired @Autowired protected Gson gson; }
然后你的测试类就能大幅简化:
public class Test_1 extends BaseSpringTest { @Test public void test_1_1 () { assertNotNull(gson); } }
public class Test_2 extends BaseSpringTest { @Test public void test_2_1 () { assertNotNull(gson); } }
方法二:Spring Boot项目专属简化
如果你的项目是Spring Boot,直接用@SpringBootTest注解就行——它已经内置了Spring上下文的扩展支持,而且同样会自动缓存上下文。基类可以写成这样:
// 可以指定配置类,也可以不指定(默认自动扫描主启动类) @SpringBootTest(classes = {Config.class}) public abstract class BaseSpringBootTest { @Autowired protected Gson gson; }
测试类同样继承这个基类就好,连@RunWith或者@ExtendWith都不用额外加,Spring Boot帮你搞定了。
额外提醒
只要你的测试类使用的上下文配置完全一致(比如@ContextConfiguration或@SpringBootTest的参数没差别),Spring就只会初始化一次上下文,不管有多少个测试类继承基类,都不用重复启动,既省时间又避免冗余代码。
内容的提问来源于stack exchange,提问作者pvjhs
相关产品推荐
相关产品推荐

