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());
}
使用@Modifying、@Query注解时,JPA直接更新数据库。不更新持久上下文。所以你的测试代码中的用户实例没有更新。您必须从数据库重新获取。
我认为使用实体管理器作为助手可以让你的测试代码变得更好。
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());
}
}