关于开发spring-boot-starter单元测试的一些总结

  1. 使用starter的方式比较简单,引入jar包即可
  2. 对于配置信息是放在application.properties文件还是使用@EnableXxx的参数形式,如果开发、测试、生产环境配置都一样,那么使用@Enable方式比较好,可以减少配置文件,同时由于几个环境相同,修改一处就全部修改,但是灵活度差点
  3. 如果配置信息全在@Enable属性中,那么可以使用实现ImportBeanDefinitionRegistrar接口的方式,大概如下:
public class LockerConfig implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, @NonNull BeanDefinitionRegistry registry) {
        MergedAnnotation<EnableLocker> anno = importingClassMetadata.getAnnotations().get(EnableLocker.class);
        String versionColumn = anno.getString("versionColumn");
        boolean failThrowException = anno.getBoolean("failThrowException");
        LockerInterceptor lockerInterceptor = new LockerInterceptor(versionColumn, failThrowException);

        // 注册locker
        DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) registry;
        beanFactory.registerSingleton("lockerInterceptor", lockerInterceptor);
    }

}
  1. 这种方式的好处,是将注解放在单元测试类头顶也能生效,可以测试不同的属性,
  2. 使用上述方式的坏处,获取属性不太方便,只能通过实现EnvironmentAwre的方式使用env获取,并且由于是properties方式获取,只能获取k,v方式的配置,对于数组就获取不到,因为ImportBeanDefinitionRegistrar实例方法被调用的时候beanFactory还没被初始化
  3. 使用下面方式的好处是,可以方便获取属性,但是:context.getBeansWithAnnotation(EnableXXX.class)获取不到单元测试类头顶的注解,不太好测试不同参数的表现
@Configuration
@EnableConfigurationProperties(SqlprinterProperties.class)
public class SQLPrinterConfig implements ApplicationContextAware {

    private final List<ValueConverter> convs = new ArrayList<>();

    @Override
    public void setApplicationContext(@Nonnull ApplicationContext context) throws BeansException {
        Collection<Object> values = context.getBeansWithAnnotation(EnableSQLPrinter.class).values();
        values.forEach(e -> {
            EnableSQLPrinter annotation = AnnotationUtils.findAnnotation(e.getClass(), EnableSQLPrinter.class);
            Class<? extends ValueConverter>[] converters = annotation.converters();
            for (Class<? extends ValueConverter> converter : converters) {
                convs.add(ReflectUtil.newInstance(converter));
            }
        });
    }

    @Bean
    public SqlPrinter sqlPrinter(SqlprinterProperties sqlprinterProperties) {
        return new SqlPrinter(sqlprinterProperties, convs);
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章