例如我有
public interface CrudUserRepository extends JpaRepository<User, Integer> {
@Modifying
@Query(nativeQuery = true, value = "UPDATE users SET active=?2 WHERE id=?1")
void setActive(long id, boolean active);
}
在测试中,我调用此方法,然后按ID查找。
@Autowired
CrudUserRepository crudUser;
@Transactional
@Test
public void setActiveTest(){
User user = getUser();
crudUser.save(user);
crudUser.setActive(user.getId(), true);
Optional<User> optUser = crudUser.findById(user.getId());
assert optUser.get().isActive(); //here my test falls
当我执行crudUser.findById(user.getId())
时,我的optUser包含该用户未处于活动状态,但实际上他处于活动状态(我已通过设置@Rollback(false)并手动检入db进行了测试)。
如何测试这种情况?
答案 0 :(得分:1)
因为crudUser.save
将缓存实体。当您调用crudUser.findById
时,JPA只是从缓存而不是从数据库获取实体。 crudUser.setActive
不会更新缓存中的entity.active
。像下面这样更改代码可以解决该问题(清除JPA缓存):
....
@PersistenceContext
EntityManager entityManager;
...
@Test
public void setActiveTest(){
...
// clear the cache and force crudUser.findById from database
entityManager.clear();
Optional<User> optUser = crudUser.findById(user.getId());
...
}