spring boot 切片测试——自定义切片
我想问大家一下使用spring boot项目的时候做单元测试的时,使用的哪种方式?
有很多小伙伴使用 spring-boot-starter-test,但是这种测试是比较笨重的,当然所花费的时间也就比较长。当你想要测一个方法时,相关于把整个spring boot 项目启动启动测试这一个方法,实际上有些东西是我们不需要的。
如果项目使用的组件很多,比如有redis,数据库,kafka,minio等其他各种组件,连spring mvc也会一同加载。与此同时这些组件的相关配置也得正确不然不能测试和启动。
在这种 情况下,网上也有一些spring切片测试的一些文章,这种方式我觉得是spring test 的是最好的方式。当你测试某个方法时,不会启动整个spirng容器,
spring test也提供了一些相关测试方式
如@WebMvcTest只测试controller层的,@DataJpaTest只测试jpa层的,@JdbcTest只测试jdbc层的。相关使用可以看网上相关贴子。
以上都是spring boot test包提供的切片方式,那如果我们要自定义切片呢。我们想启动spring容器只加载指定一个bean,或我们已知几个bean,并测试bean方法,怎么办,
直接上代码,分三步,
- 首先,需要实现SpringBootTestContextBootstrapper接口
public class SpringMyTest extends SpringBootTestContextBootstrapper {
@Override
protected String[] getProperties(Class<?> testClass) {
return MergedAnnotations.from(testClass, MergedAnnotations.SearchStrategy.INHERITED_ANNOTATIONS).get(SpringBase.class)
.getValue("properties", String[].class).orElse(null);
}
}
- 定义一个注解SpringBase
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@BootstrapWith(SpringMyTest.class)
@ExtendWith(SpringExtension.class)
@OverrideAutoConfiguration(enabled = false)
@AutoConfigureCache
@ImportAutoConfiguration
public @interface SpringBase {
String[] properties() default {};
}
- 编写测试用例
/**
*
*/
@SpringBase
//可指定某个自动配置类。
@ImportAutoConfiguration(XXXAutoConfiguration.class)
////可指定某个bean类。
//@Import({})
public class Test {
@Autowired
private Environment environment;
@Autowired
private xxxxxxBean bean;
/**
* 此配置类一定要加,不然spring容器不能运行。
*/
@Configuration
public static class TestConfig {
@Bean
public String testBean() {
return "testBean";
}
}
@Resource(name = "testBean")
private String testBean;
@Test
void testEvn() {
String profiles = environment.getProperty("user.dir");
System.out.println((profiles));
System.out.println(testBean);
bean.method();
}
}
spring 容器正常运行,并输出测试结果

山外青山楼外楼
青山与小楼已不冉有
紧闭的窗前你别等候
大雁飞过菊花香满楼、
听一听看一看想一想
时光呀流水匆匆过
哭一哭笑一笑不用说
人生能有几回合

浙公网安备 33010602011771号