测试不会扩展任何Spring Data Repository的存储库

时间:2019-10-02 08:17:04

标签: java spring-boot junit4 spring-repositories

我正在为我的应用程序编写单元测试和集成测试,但是测试存储库有问题。

这是处理权限的非常简单的回购协议:

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;
    }
}

关于此代码,我有两个问题:

  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相当慢,因为它会创建整个应用程序上下文,我想使这些测试更快。 我在main和test中都使用了H2数据库,该数据库在application.properties文件中声明。

1 个答案:

答案 0 :(得分:0)

@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进行所有这些测试。

感谢评论,帮助我更好地理解了集成测试。