@DataJpaTest的集成测试

问题描述

我的项目中有此测试:

File           Original Author         First Added       Commit
----------------------------------------------------------------
a.yaml            tom                  01/01/2020        1a12121
b.yaml            Felix                05/01/2020        ad12257
[...]

local-configuration.properties:

@DataJpaTest
@SpringBoottest
@TestPropertySource(locations = "classpath:local-configuration.properties")
public class CanPixaRepositoryTest  {

    @Autowired
    private CanPixaRepository canPixaRepository;

    public void setUp() throws Exception {
    }

    @Test
    public void testAll() {
        canPixaRepository].getAvui("fqs");
    }
}

但是当我运行测试时,canPixaRepositoryRepository为空

解决方法

对于Spring引导应用程序,最简单的方法是如果使用JPA和Spring Data JPA,则将@DataJpaTest与H2一起使用来测试您的存储库。

  1. 将h2依赖项添加到您的测试范围。 Spring Boot将自动配置它,并在测试阶段使用它来替换运行时DataSource。
  2. @DataJpaTest注释测试。然后,Spring应用程序上下文中将提供EntityManager,您的存储库和用于测试的TestEntityManager

选中my example here

(Spring 5 / Spring Boot 2添加了Junit 5支持,如果您使用的是Junit 5集成,则不需要@Runwith@Extendwith,在Spring之前,DataJpaTest本身是一个元注释。 2.4,要启用Junit5,您必须从spring-boot-test中排除JUnit 4并手动添加JUnit5。在即将到来的Spring Boot 2.4中,JUnit 5是默认的测试运行器。

,

@SpringBootTest批注用于设置整个应用程序上下文,而@DataJpaTest将设置应用程序上下文,以便您可以测试与jpa相关的代码,为此它将设置应用程序上下文的一部分特定的用例。因此,无需将@SpringBootTest的注解与@DataJpaTest一起使用,就可以像这样使用它:

@ExtendWith(SpringExtension.class)
@DataJpaTest
@TestPropertySource(locations = "classpath:local-configuration.properties")
public class CanPixaRepositoryTest  {

    @Autowired
    private CanPixaRepository canPixaRepository;

    public void setUp() throws Exception {
    }

    @Test
    public void testAll() {
        canPixaRepository.getAvui("fqs");
    }
}

从SpringBoot 2.1开始,您不必提供@ExtendWith注释就可以告诉Junit启用spring支持,因为已经提供了@SpringBootTest@DataJpaTest之类的注释。