我想为我的 JpaRepository 之一的更新查询编写一个单元测试。以下是我的实现。
public interface UserRepository extends JpaRepository<User, Integer> {
@Modifying
@Query("update User u set u.active = false where u.userId = :userId")
void updateEmployee(Integer userId);
.......
}
在测试用例中,我写如下,
@DataJpaTest
class UserAppRepoTest {
@Autowired
private EntityManager entityManager;
@Autowired
private UserRepository userRepository;
public void flushAndClear() {
entityManager.flush();
entityManager.clear();
}
@Test
public void updateUserRecord() {
User user = new User();
user.setUserId(2);
entityManager.merge(user);
flushAndClear();
userRepository.updateEmployee(user.getUserId());
User result = entityManager.find(User.class, user.getUserId());
assertEquals(false, result.getActive());
}
}
但是这里测试用例仅通过了user.setUserId(2)。如果 userId 设置为其他整数值,则测试用例失败。我找不到,为什么它只发生在 userId = 2 上。用户对象对于其他整数正在获取 null(result = null) 。例如, user.setUserId(1), user.setUserId(3),....等等。我希望知道我是否遵循为特定查询编写测试用例的正确方法?
测试的查询是更新,因此实体必须已经存在。事实上,您的代码中的测试设置
User user = new User();
user.setUserId(2);
entityManager.merge(user);
添加 ID 为 2 的用户。这是
User
唯一知道的 entityManager
实例,因此引用任何其他 userId 将返回 null。
此外,测试也做出了这样的断言:
assertEquals(false, result.getActive());
但是再次查看测试设置:
User user = new User();
user.setUserId(2);
entityManager.merge(user);
该用户可能已经不活动(除非默认构造函数将用户设置为活动)。所以测试设置可能应该类似于:
User user = new User();
user.setUserId(2);
user.setActive(true); // set as active
entityManager.merge(user);
然后断言:
assertEquals(false, result.getActive());
验证更新查询是否按预期工作。