gpt4 book ai didi

java - spring boot 集成测试 - 数据库未使用 @WebMvcTest Autowiring

转载 作者:行者123 更新时间:2023-12-04 01:42:25 24 4
gpt4 key购买 nike

我有这个 sprig 启动(版本 1.5.6)应用程序,它使用以下内容:

  • spring boot starter 数据 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 能够在第一个测试中 Autowiring jpa 存储库并且它在应用程序中运行良好,我认为它也应该能够在 webMvc 测试用例中 Autowiring 存储库。

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

    请建议。

    最佳答案

    我看到你有 @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>

    关于java - spring boot 集成测试 - 数据库未使用 @WebMvcTest Autowiring ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46081047/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com