java DataJpaTest中不支持为更新JPQL编写测试用例

nxowjjhe  于 2024-01-05  发布在  Java
关注(0)|答案(1)|浏览(179)
  1. public interface UserRepository extends JPARepository<User, Integer> {
  2. @Modifying
  3. @Query("update User u set u.active = false where u.userId = :userId")
  4. void updateEmployee(Integer userId);
  5. .......
  6. }

字符串
我是新的单元测试.所以我试图写测试用例为JPQL使用DataJpaTest为上述存储库方法.每次我的测试用例失败时,我用下面的方法来测试也我不能确定我犯了错误.如果有人有一个解决方案,这将是真的对我有帮助.提前感谢.!
在测试用例中,我写道,字段active不会更新,并且值也为null。

  1. @Test
  2. void updateUserRecord(){
  3. User user = new User();
  4. user.setUserId(1);
  5. userRepository.save(user);
  6. userRepository.updateEmployee(user.getUserId());
  7. assertFalse(user.getActive());
  8. }

qybjjes1

qybjjes11#

当使用@Modifying,@Query注解时,JPA直接更新数据库。不更新持久化上下文。所以测试代码中的用户示例没有更新。您必须从数据库重新获取。
我认为使用实体管理器作为助手会使你的测试代码更好。
1.用实体管理器准备数据。之后刷新和清除。

  • flush方法将持久上下文中的实体更改反映到数据库。
  • clear方法清除持久上下文。

1.更新用户数据
1.再次从数据库中查找结果。

  1. package com.example.demo;
  2. import com.example.demo.app.User;
  3. import com.example.demo.app.UserRepository;
  4. import jakarta.persistence.EntityManager;
  5. import org.junit.jupiter.api.Test;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
  8. import static org.junit.jupiter.api.Assertions.assertEquals;
  9. @DataJpaTest
  10. class DemoApplicationTests {
  11. @Autowired
  12. EntityManager entityManager;
  13. @Autowired
  14. UserRepository userRepository;
  15. void flushAndClear() {
  16. entityManager.flush();
  17. entityManager.clear();
  18. }
  19. @Test
  20. void updateUserRecord() {
  21. User user = new User();
  22. user.setUserId(1);
  23. entityManager.persist(user);
  24. flushAndClear();
  25. userRepository.updateEmployee(user.getUserId());
  26. User result = entityManager.find(User.class, user.getUserId());
  27. assertEquals(false, result.getActive());
  28. }
  29. }

字符串

展开查看全部

相关问题