Я пишу юнит-тесты и интеграционные тесты для своего приложения, и у меня возникла проблема с тестированием репозиториев.
Это очень простое репо для обработки полномочий:
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У меня есть два вопроса относительно этого кода:
Это неправильный подход, чтобы не расширять интерфейс Spring Data Repository? Помимо того, что нет необходимости писать все методы для связи с базой данных, каковы другие преимущества ее использования?
Как я могу протестировать этот репозиторий, используя минимальные ресурсы? @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
.