關於開發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);
    }

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