我想为我的一个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,user对象变空(result = null)。例如,user.setUserId(1),user.setUserId(3),....等等。我希望知道我正在为特定查询编写测试用例的正确方法?
1条答案
按热度按时间7qhs6swi1#
测试中的查询是一个更新,因此实体必须已经存在。
字符串
添加ID为2的用户。这是
entityManager
唯一知道的User
示例,因此引用任何其他userId将返回null。此外,该测试还执行以下Assert:
型
再看看测试设置:
型
该用户可能已经不是活动的(除非构造函数将用户设置为活动)。因此测试设置可能类似于:
型
然后Assert:
型
验证更新查询是否按预期对用户起作用。
也许在测试设置中添加两个用户,都是活动的。然后可以验证ID为2的用户不再活动,而另一个用户仍然活动。这将验证查询 where 子句。