gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:44:03 25 4
gpt4 key购买 nike

比如我有

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) 进行了测试并手动 checkin 数据库)。

我如何测试该案例?

最佳答案

因为 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());
...
}

关于java - 如何从标记为@Modifying 的存储库中测试方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52857963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com