Тестирование репозиториев, которые не расширяют какой-либо Spring Data Repository - PullRequest
0 голосов
/ 02 октября 2019

Я пишу юнит-тесты и интеграционные тесты для своего приложения, и у меня возникла проблема с тестированием репозиториев.

Это очень простое репо для обработки полномочий:

public interface AuthorityRepository {
    Authority saveAuthority (Authority authority);

}
@Repository
public class AuthorityRepositoryImpl implements AuthorityRepository {
    @PersistenceContext
    EntityManager entityManager;
    @Autowired
    public AuthorityRepositoryImpl(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Override
    @Transactional
    public Authority saveAuthority(Authority authority) {
        entityManager.persist(authority);
        return authority;
    }
}

IУ меня есть два вопроса относительно этого кода:

  1. Это неправильный подход, чтобы не расширять интерфейс Spring Data Repository? Помимо того, что нет необходимости писать все методы для связи с базой данных, каковы другие преимущества ее использования?

  2. Как я могу протестировать этот репозиторий, используя минимальные ресурсы? @DataJpaTest не работает, потому что (из моего понимания) он выбирает репозитории, которые расширяют любой Spring Data Repository. Это работает:

@RunWith(SpringRunner.class)
@SpringBootTest
public class AuthorityRepositoryTest {
    @Autowired
    private AuthorityRepository authorityRepository;
    @PersistenceContext
    private EntityManager entityManager;

    @Test
    public void test () {
        Authority authority = new Authority();
        authority.setName("name");
        authority.setUsername("username");
        authorityRepository.saveAuthority(authority);
        assertNotNull(entityManager.find(Authority.class, 1));
    }

Но @SpringBootTest довольно медленный, поскольку создает весь контекст приложения, и я хотел бы ускорить эти тесты. Я использую базу данных H2 как в main, так и в test, которая объявлена ​​в файле application.properties.

1 Ответ

0 голосов
/ 02 октября 2019

@DataJpaTest работает в сочетании с @Import(repo.class). Это выглядит так:

@RunWith(SpringRunner.class)
@DataJpaTest ()
@Import(AuthorityRepositoryImpl.class)
public class AuthorityRepositoryTest2 {

    @Autowired
    AuthorityRepository authorityRepository;
    @Autowired
    TestEntityManager testEntityManager;

    @Test
    public void test() {
        Authority authority = new Authority();
        authority.setUsername("name");
        authority.setUsername("username");
        authorityRepository.saveAuthority(authority);
        assertNotNull(testEntityManager.find(Authority.class, 1));
    }

Я узнал, что если я проведу интеграционное тестирование, то смогу также создать весь контекст приложения и протестировать все, что я хочу, повторно используя этот один контекст, поэтому позже, когда я напишу больше интеграционных тестовдля других частей моего приложения я все равно буду использовать @SpringBootTest для всех этих тестов.

Спасибо за комментарии, помог мне лучше понять интеграционные тесты.

...