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

问题描述 投票:0回答:1

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

java spring-boot junit junit5 data-jpa-test
1个回答
0
投票

测试的查询是更新,因此实体必须已经存在。事实上,您的代码中的测试设置

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());

验证更新查询是否按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.