在Spring Boot 中,将 @SpringBootTest 注解加载测试类中可以很方便的进行测试。
如果是JPA的数据操作, 则测试方法执行时会报 No EntityManager with actual transaction available for current thread
的错误, 翻译一下就是“当前线程没有事务支持”。
解决方法时在测试类或是方法上增加注解:@Transactional
再执行如下测试方法:
@Test
public void add() {
Usr usr = new Usr(1,"张三",1);
entityManager.persist(usr);
}
方法是成功执行了, 但是查询数据库表却没有数据。 原因是:Spring Test 对数据库的操作在方法执行完成后会回滚事务, 也就是数据不会实际写入到Db , 这个设计其实也很合理。 特别是在实际环境中, 如果不可避免的要在正式环境中测试, 这种设计会比较安全。
如果实在要在Test 写入Db, 则需要增加 @Rollback(false) 注解。
综合起来, 如果要在Test 要插入数据到Db , 需要以下两个注解:
@Transactional
@Rollback(false)
public class JpqlTests {
}
- @Transactional ,开启事务, 这是JPA 的标准注解
- @Rollback(false) , Spring Test的专属注解, 不会回滚, 也就是实际写入到数据库。 在实际业务代码中不可使用。
注: 这两个注解也可以使用在测试方法上, 只对该测试类的某个方法生效。