首页 文章

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

提问于
浏览
0

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

  • spring boot starter data jpa(jpa存储库和实体)

  • spring boot starter数据gemfire(没有存储库或实体)

  • spring boot starter数据休息(用于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 回答

  • 4

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

    使用Spring Boot进行JPA测试的方式是使用 @DataJpaTest 注释 . 它会自动配置所有内容,前提是您在类路径中有内存中的数据库(如果使用maven,请确保它位于"testing"范围内) . 它还提供了 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>
    

相关问题