0


测试之@Sql(自动插入sql脚本,测试后销毁)

前言

解决测试时测试数据写入与销毁不方便,使用@Sql自动导入sql脚本语句,结合@Transactional事务回滚实现测试后数据销毁,便捷测试。

@Sql

@Sql注解可以执行SQL脚本,也可以执行SQL语句。它既可以加上类上面,也可以加在方法上面。 默认情况下,方法上的@Sql注解会覆盖类上的@Sql注解,但可以通过@SqlMergeMode注解来修改此默认行为。

@Sql有下面的属性:

 config:配置@SqlConfig,它的作用域是其@Sql注释的本地范围。它用于配置commentPrefix、分隔符等。
 ​
 executionPhase:决定何时执行SQL脚本和语句。默认是BEFORE_TEST_METHOD。
 ​
 statements:配置执行内联SQL语句。
 ​
 scripts:配置SQL脚本执行的路径。
 ​
 value:脚本元素的别名。脚本和值不能一起使用,但可以与statement元素一起使用。

@SqlConfig

用于配置如何去解释@Sql注解中指定的Sql脚本。 可以用于类上,也可以用于方法上。 @Sql注解也有一个config属性,作用与@SqlConfig相同,不同的是作用域只在对应的@Sql注解范围。它的优先级也大于类注解的

 blockCommentStartDelimiter:多行注释开始字符,默认是/*。
 ​
 blockCommentEndDelimiter:多行注释结束字符,默认是*/。
 ​
 commentPrefix:单行注释前缀,默认是–。
 ​
 commentPrefixes:指定多个单行注释前缀,默认是["–"]。
 ​
 dataSource:指定脚本执行的数据库的名字,只有在多个数据源时需要指定。
 ​
 encoding:指定sql脚本文件的字符编码。
 ​
 errorMode:配置错误模式,默认是SqlConfig.ErrorMode的DEFAULT。
 ​
 separator:配置脚本语句分隔符,默认是’\n’。
 ​
 transactionManager:指定transactionManager bean,只有有多个transactionManager时需要指定。
 ​
 transactionMode:指定脚本执行的事务模式,默认是SqlConfig.TransactionMode的DEFAULT。

@SqlMergeMode

@SqlMergeMode

可以加在类上,也可以加在方法上。用于指示方法上的@Sql和类上@Sql注解配置是否合并。方法上的@SqlMergeMode注解优先级更高。默认值是

SqlMergeMode.MergeMode

OVERRIDE

@Transactional

需要开启事务注解,这样测试中添加的数据会在测试后自动销毁,便于多次测试。

该注解需要在启动类处配置开启事务允许@EnableTransactionManagement

案例

sql:

 CREATE TABLE `user` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `username` varchar(50) DEFAULT NULL,
   `password` varchar(50) DEFAULT NULL,
   `name` varchar(50) DEFAULT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
 ​
 ​
 INSERT INTO `user` VALUES ('1', 'zhangsan', '123', '张三');
 INSERT INTO `user` VALUES ('2', 'lisi', '123', '李四');

测试时插入的脚本语句user.sql:

 insert into user values (3,"wangwu","12343","王五");

Controller:

 import java.util.List;
 ​
 @RestController
 public class UserController {
 ​
     @Autowired
     private UserService userService;
 ​
     @PostMapping("/hello")
     public List<UserEntity> getList(){
         return userService.list();
     }
 ​
 }

test(以验证@Sql与回滚功能为主):

 @RunWith(SpringRunner.class)
 @SpringBootTest
 @Transactional
 @AutoConfigureMockMvc
 @Sql(scripts = "/user.sql")
 //@SqlConfig(encoding = "UTF-8")
 class UserControllerTest {
 ​
     @Autowired
     MockMvc mockMvc;
 ​
     @Test
     void getList() throws Exception {
         MvcResult mvcResult = mockMvc.perform(post("/hello")).andReturn();
 ​
         MockHttpServletResponse response = mvcResult.getResponse();
         response.setCharacterEncoding("UTF-8");
         String JsonReturn = response.getContentAsString();
 ​
         // json转List
         List<UserEntity> userEntity = new ObjectMapper().readValue(JsonReturn,
                                                  new TypeReference<List<UserEntity>>(){});
         userEntity.forEach(System.out::println);
 ​
     }
 ​
 }

result:

 UserEntity(id=1, username=zhangsan, password=123, name=张三)
 UserEntity(id=2, username=lisi, password=123, name=李四)
 UserEntity(id=3, username=wangwu, password=12343, name=王五)

而数据库内不会出现新记录:

参考自:

Spring 单元测试中使用@Sql准备数据_xiegwei的博客-CSDN博客_单元测试数据库数据准备

@Sql Example in Spring Test (concretepage.com)

推荐直接点进注解定义处看不同属性的注释说明。

英语基础较差推荐使用

  • 有道词典(划词翻译)

  • idea插件Translation

划词右键:


本文转载自: https://blog.csdn.net/system_cls/article/details/124270066
版权归原作者 夜落% 所有, 如有侵权,请联系我们删除。

“测试之@Sql(自动插入sql脚本,测试后销毁)”的评论:

还没有评论