当我为UserRepository运行测试用例时,它是独立运行的(例如mvn test -Dtest=UserRepository.class
)。
但是当我运行mvn test
时,它会失败。
我得到一个java.lang.NullPointerException
我的测试课程为:
@RunWith(SpringRunner.class)
@DataJpaTest
public class UserRepositoryTest {
@Autowired
private EntityManager entityManager;
@Autowired
private UserRepository userRepository;
// This validates the Hibernate Constraints
private Validator validator;
一个示例测试用例是:
@Test
public void repo_should_create_a_user() {
User u = new User();
u.setUserName("firstUser");
u.setRole(User.Role.USER);
entityManager.persist(u);
User user = userRepository.findAll().get(0);
Assert.assertThat( user, instanceOf(User.class) );
assertEquals("firstUser", user.getUserName());
}
User
实体具有常规属性,例如电子邮件和密码,等等。此外,它还包含诸如created_by
和modified_by
之类的审核功能,这些功能利用安全上下文来获取当前用户。
任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
一种可能性是,当运行不同的测试时,以后的测试在第一个测试之后会使数据库处于脏状态,因此,如果UserRepositoryTest
在其他测试之后运行,则它们可能会在数据库中留下一些垃圾。数据库。
通常,最好是确保数据库中没有“垃圾”数据。
一种方法是在测试中使用@Transactional
批注,以便如果所有内容都正确集成,则在测试后更改的数据将在测试后自动从db中删除,因为Spring将回滚事务。
这将确保下一步不会产生垃圾。
答案 1 :(得分:0)
事实证明,我在User类中使用数据库审核属性,而created_by
类中的modified_by
和User
属性利用SecurityContextHolder.getContext().getAuthentication()
来获取当前用户。
我在测试方法中添加了@WithMockUser
,它开始起作用。我不完全了解仅独立类或仅方法的测试用例如何工作,并且整体测试失败。但是添加此注释显然使每个人都很高兴。