Java单元测试用例仅支持特定的id值,不支持其他整数值

uwopmtnx  于 5个月前  发布在  Java
关注(0)|答案(1)|浏览(42)

我想为我的一个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),....等等。我希望知道我正在为特定查询编写测试用例的正确方法?

7qhs6swi

7qhs6swi1#

测试中的查询是一个更新,因此实体必须已经存在。

User user = new User();
user.setUserId(2);
entityManager.merge(user);

字符串
添加ID为2的用户。这是entityManager唯一知道的User示例,因此引用任何其他userId将返回null。
此外,该测试还执行以下Assert:

assertEquals(false, result.getActive());


再看看测试设置:

User user = new User();
user.setUserId(2);
entityManager.merge(user);


该用户可能已经不是活动的(除非构造函数将用户设置为活动)。因此测试设置可能类似于:

User user = new User();
user.setUserId(2);
user.setActive(true); // add to the test setup
entityManager.merge(user);


然后Assert:

assertEquals(false, result.getActive());


验证更新查询是否按预期对用户起作用。
也许在测试设置中添加两个用户,都是活动的。然后可以验证ID为2的用户不再活动,而另一个用户仍然活动。这将验证查询 where 子句。

相关问题