存储库测试是独立运行的,但总体上失败(MVN测试)

时间:2019-03-18 02:43:04

标签: maven unit-testing spring-boot flyway

当我为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_bymodified_by之类的审核功能,这些功能利用安全上下文来获取当前用户。

任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:1)

一种可能性是,当运行不同的测试时,以后的测试在第一个测试之后会使数据库处于脏状态,因此,如果UserRepositoryTest在其他测试之后运行,则它们可能会在数据库中留下一些垃圾。数据库。

通常,最好是确保数据库中没有“垃圾”数据。

一种方法是在测试中使用@Transactional批注,以便如果所有内容都正确集成,则在测试后更改的数据将在测试后自动从db中删除,因为Spring将回滚事务。

这将确保下一步不会产生垃圾。

答案 1 :(得分:0)

事实证明,我在User类中使用数据库审核属性,而created_by类中的modified_byUser属性利用SecurityContextHolder.getContext().getAuthentication()来获取当前用户。

我在测试方法中添加了@WithMockUser,它开始起作用。我不完全了解仅独立类或仅方法的测试用例如何工作,并且整体测试失败。但是添加此注释显然使每个人都很高兴。