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

问题描述 投票:0回答:1
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 为上述存储库方法编写 JPQL 测试用例。每次我的测试用例失败时,我也使用以下方法进行测试 无法确定我在哪里犯了错误。如果有人有解决方案,那对我来说真的很有帮助。 预先感谢。!

在测试用例中,我写道,字段active未更新,并且该值也为空。

@Test
void updateUserRecord(){
    User user = new User();
    user.setUserId(1);
    userRepository.save(user);
    
    userRepository.updateEmployee(user.getUserId());
    
    assertFalse(user.getActive());
} 
java spring-boot junit5 data-jpa-test
1个回答
0
投票

使用@Modifying、@Query注解时,JPA直接更新数据库。不更新持久上下文。所以你的测试代码中的用户实例没有更新。您必须从数据库重新获取。

我认为使用实体管理器作为助手可以让你的测试代码变得更好。

  1. 使用实体管理器准备数据。之后冲洗并清除。
  2. 更新用户数据
  3. 再次从数据库查找结果。
package com.example.demo;

import com.example.demo.app.User;
import com.example.demo.app.UserRepository;
import jakarta.persistence.EntityManager;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;

import static org.junit.jupiter.api.Assertions.assertEquals;

@DataJpaTest
class DemoApplicationTests {

    @Autowired
    EntityManager entityManager;
    @Autowired
    UserRepository userRepository;

    void flushAndClear() {
        entityManager.flush();
        entityManager.clear();
    }

    @Test
    void updateUserRecord() {
        User user = new User();
        user.setUserId(1);
        entityManager.persist(user);
        flushAndClear();


        userRepository.updateEmployee(user.getUserId());


        User result = entityManager.find(User.class, user.getUserId());
        assertEquals(false, result.getActive());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.