spring boot集成测试 - 数据库未与@WebMvcTest一起自动装配

时间:2017-09-06 17:21:57

标签: java spring jpa spring-boot integration-testing

我有这个使用以下内容的sprig boot(版本1.5.6)应用程序:

  • spring boot starter data jpa(jpa存储库和实体)
  • spring boot starter data gemfire(没有存储库或实体)
  • spring boot starter data rest(用于HAL支持)

现在,我正在为此应用程序创建单元测试。在一个测试用例中,我有以下注释:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = { "spring.cloud.enabled=false" })

测试正确初始化了jpa存储库,我可以测试它。

然后我有另一个带有以下注释的测试:

@RunWith(SpringRunner.class)
@WebMvcTest(MyRestController.class)

此测试设置Mockmvc,但它不初始化JPA存储库。它只初始化配置的MVC部分。但是我也需要初始化JPA存储库。我有data.sql文件的测试数据设置,它作为内存H2数据库加载。我得到的错误是:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available

我尝试了多项尚未解决的问题:

  • 使用这两个注释不起作用,因为该类只能有一个" BootstrapWith"注释
  • @EnableJpaRepositories不起作用
  • @AutoConfigureTestDatabase不起作用

我在上下文初始化时看到以下内容:

.s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!

既然spring能够在第一次测试中自动装配jpa存储库并且它在应用程序中工作正常,我认为它应该能够在webMvc测试用例中自动装配存储库。

我可以创建一个配置文件并初始化测试包中的实体管理器,数据源等,但如果有办法用spring自动装配东西,那么我不想管理那个配置。

请建议。

1 个答案:

答案 0 :(得分:4)

我看到你有@WebMvcTest注释。特定的一个是仅测试Web层,它不加载整个应用程序上下文,只加载Web上下文。您可能需要切换到@SpringBootTest@AutoConfigureMockMvc来测试整个堆栈。

使用Spring Boot进行JPA测试的方式是使用@DataJpaTest注释。它会自动配置所有内容,前提是您在类路径中有一个内存中的数据库(如果您使用maven,请确保它在“测试”范围内)。它还提供了TestEntityManager,它是JPA EntityManager接口的一个实现,具有一些有用的测试功能。

示例:

@RunWith(SpringRunner.class)
@DataJpaTest
pubic class EntityTest {
    @Autowired TestEntityManager entityManager;

    @Test
    public void saveShouldPersistData() throws Exception {
        User saved = entityManager.persistFlushFind(new User("username", "password"));
        assertNonNull(saved);
    }
}

在你的pom.xml中你可以添加H2数据库(Spring Boot也可以自动配置Derby和HSQLDB)

<dependency>
  <groupId>com.h2database</groupId>
  <artifactId>h2</artifactId>
  <scope>test</scope>
</dependency>