前言
解决测试时测试数据写入与销毁不方便,使用@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
划词右键:
版权归原作者 夜落% 所有, 如有侵权,请联系我们删除。