Тест репозитория выполняется изолированно, но в целом не проходит (тест mvn) - PullRequest
0 голосов
/ 18 марта 2019

Когда я запускаю тестовые случаи для 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, которые используют контекст безопасности для извлечения текущего пользователя.

Любая помощь приветствуется.Спасибо.

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Одна из возможностей заключается в том, что при выполнении разных тестов более поздние тесты переводят базу данных в грязное состояние после первого теста, поэтому, если UserRepositoryTest запускается после других тестов, они могут оставить некоторый мусор в базе данных.

В общем, лучше всего убедиться, что в базе данных нет данных «мусора».

Одним из способов является использование @Transactional аннотации в тестах, чтобы при правильной интеграции все данные, которые были изменены в ходе тестов, автоматически удалялись из базы данных после теста, поскольку Spring откатит транзакцию.

Это гарантирует, что следующий шаг не получит этот мусор.

0 голосов
/ 19 марта 2019

Как оказалось, я использую свойства аудита базы данных в своем классе User, а свойства created_by и modified_by в классе User используют SecurityContextHolder.getContext().getAuthentication() для выборки текущего пользователя.

Я добавил @WithMockUser в метод теста, и он начал работать.Я точно не знаю, как работали независимые классы или тесты только метода, и общий тест не удался.Но добавление этой аннотации, очевидно, делает всех счастливыми.

...