Spring DAO测试中如何全局设置@Sql的@SqlConfig编码?
1. 先搞个自定义组合注解,消灭重复代码
既然每个测试方法都在写重复的@Sql(config = @SqlConfig(encoding = "UTF-8")),不如把这些配置封装成一个自定义注解,以后直接用这个注解就行:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Test @Sql(config = @SqlConfig(encoding = "UTF-8")) public @interface Utf8SqlTest { // 把原@Sql的scripts属性暴露出来,方便指定脚本 String[] scripts() default {}; }
然后你的测试方法就可以简化成:
@Utf8SqlTest(scripts = "dataSetWithChangesetsOnly.sql") public void testCreate_Ok() { // ... }
这样不仅减少了重复,以后要改编码或者其他配置,只需要改这一个注解就行。
2. 全局配置(覆盖整个测试类/模块)
如果想彻底不用在注解里写编码,直接全局生效,Spring 5.2及以上版本支持通过配置属性来设置@Sql的默认配置。你只需要在src/test/resources/application-test.properties(或者application.yml)里加一行:
spring.test.sql.config.encoding=UTF-8
这样整个Maven模块里所有的@Sql注解都会默认使用UTF-8编码,不管是类级别的还是方法级别的,除非你在某个@Sql里显式指定了不同的config(比如@Sql(config = @SqlConfig(encoding = "GBK")))才会覆盖这个全局设置。
为什么之前类级别的设置无效?
你提到在测试类顶部设置编码对带自定义注解的方法无效,大概率是因为方法上的@Sql显式指定了自己的config参数,这会直接覆盖类级别的@SqlConfig配置。而上面的全局属性配置是优先级更高的默认值,你可以把方法里重复的config参数去掉,直接依赖全局配置即可。
3. 如果是老版本Spring(低于5.2)怎么办?
如果你的Spring版本比较老,不支持上面的全局属性,那可以用TestExecutionListener来统一处理。不过这个方案稍微复杂点,不如升级Spring版本或者用自定义注解来得方便。
总结一下,最推荐的是全局配置属性+自定义注解的组合:先全局设置编码,再用自定义注解封装常用的@Sql配置,这样既不用重复写代码,又能保证整个模块的编码统一。
内容的提问来源于stack exchange,提问作者JiKra

