如何从标记为@Modifying的存储库中测试方法?

时间:2018-10-17 15:01:42

标签: java junit spring-data-jpa

例如我有

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进行了测试)。

如何测试这种情况?

1 个答案:

答案 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());
  ...
}