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方法,怎么办,

直接上代码,分三步,

  1. 首先,需要实现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);
    }

}

  1. 定义一个注解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 {};
}

  1. 编写测试用例
/**
 * 
 */
@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 容器正常运行,并输出测试结果

image

posted @ 2023-04-25 11:00  quentin2017  阅读(435)  评论(0)    收藏  举报