郑州网站建设msgg,北京建设网上银行,wordpress 七牛 插件,联合会网站建设目录 一、背景二、对Dao层进行单元测试1 低效的方式1.1 使用SpringBootTest#xff1a;1.2 其他低效的方式 2 高效的方式2.1 示例#xff08;报错#xff1a;Failed to replace DataSource with an embedded database for tests#xff09;2.2 解决办法2.2.1 禁用自动配置的… 目录 一、背景二、对Dao层进行单元测试1 低效的方式1.1 使用SpringBootTest1.2 其他低效的方式 2 高效的方式2.1 示例报错Failed to replace DataSource with an embedded database for tests2.2 解决办法2.2.1 禁用自动配置的数据源替换 一、背景
虽然我们可以借助插件来高效生成xxxDO、xxxMapper.java、xxxMapper.xml但我们还需要对其进行修改。而在修改的过程中我们可能会漏了逗号或者类的字段类型与表的列类型不匹配这都会导致增删改查失败。每次失败重新启动应用的话会增加测试的时间开销。JRebel热部署插件虽然能热部署xml文件但有时候会失效。因此在进行controller-service-dao功能测试之前我们要先对dao层进行单元测试。
二、对Dao层进行单元测试
1 低效的方式
1.1 使用SpringBootTest
SpringBootTest
class UserMapperTest {Autowiredprivate UserMapper userMapper;Testvoid insert() {UserDO user new UserDO();user.setName(John);user.setAge(30);userMapper.insert(user);assertNotNull(user.getId(), Insert should generate ID);UserDO retrievedUser userMapper.selectById(user.getId());assertNotNull(retrievedUser, User should be retrieved after insertion);assertEquals(John, retrievedUser.getName(), Name should match);assertEquals(30, retrievedUser.getAge(), Age should match);}...
}低效的原因使用SpringBootTest会加载整个应用的上下文。
1.2 其他低效的方式
把整个SpringBoot应用跑起来通过Postman进行测试。 企业级应用要么本地起不来要不跑一次要若干分钟。这么测试又要加班了…
2 高效的方式
SpringBoot整合Mybatis引入了这个依赖
dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.3.2/version
/dependency同理也有对应的测试依赖
dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter-test/artifactIdversion2.3.2/version
/dependency官方文档 2.1 示例报错Failed to replace DataSource with an embedded database for tests
MybatisTest
class UserMapperSimpleTest {Autowiredprivate UserMapper userMapper;Testvoid deleteById() {UserDO user new UserDO();user.setName(Alice);user.setAge(25);userMapper.insert(user);Integer userId user.getId();assertNotNull(userId, Insert should generate ID);userMapper.deleteById(userId);UserDO deletedUser userMapper.selectById(userId);assertNull(deletedUser, User should be deleted);}
}报错Caused by: java.lang.IllegalStateException: Failed to replace DataSource with an embedded database for tests. If you want an embedded database please put a supported one on the classpath or tune the replace attribute of AutoConfigureTestDatabase.原因在测试中 Spring Boot 尝试替换数据源为一个内嵌的数据库但是它找不到一个支持的内嵌数据库。
2.2 解决办法
配置支持的内嵌数据库很麻烦又要建表又要构造数据禁用自动配置的数据源替换很方便一方面本地环境操作的是日常数据库另一方面MyBatis 测试是事务性的默认在每次测试结束时回滚
2.2.1 禁用自动配置的数据源替换
MybatisTest
AutoConfigureTestDatabase(replace AutoConfigureTestDatabase.Replace.NONE)
class UserMapperSimpleTest {Autowiredprivate UserMapper userMapper;Testvoid insert() {UserDO user new UserDO();user.setName(John);user.setAge(30);userMapper.insert(user);assertNotNull(user.getId(), Insert should generate ID);UserDO retrievedUser userMapper.selectById(user.getId());assertNotNull(retrievedUser, User should be retrieved after insertion);assertEquals(John, retrievedUser.getName(), Name should match);assertEquals(30, retrievedUser.getAge(), Age should match);}Testvoid deleteById() {UserDO user new UserDO();user.setName(Alice);user.setAge(25);userMapper.insert(user);Integer userId user.getId();assertNotNull(userId, Insert should generate ID);userMapper.deleteById(userId);UserDO deletedUser userMapper.selectById(userId);assertNull(deletedUser, User should be deleted);}}我测试了下Service标注的类确实没法注入了。
MybatisTest
AutoConfigureTestDatabase(replace AutoConfigureTestDatabase.Replace.NONE)
class UserMapperSimpleTest {Autowiredprivate UserMapper userMapper;Autowired(required false)private IUserService userService;Testvoid testUserServiceNotInjected() {assertNull(userService, User service should not be injected);}Testvoid testUserMapperInjected() {assertNotNull(userMapper, User mapper should be injected);}
}而如果是SpringBootTest就会把Service标注的类也注入到容器中。