在Spring Boot中使用嵌入式数据库进行测试

9

我有一个Spring Boot应用程序,其中包含一些@Entity类和对应的@RepositoryRestResource存储库接口。现在我想编写一些测试,以便我可以使用这些存储库将新记录添加到我的数据库中,但我不想使用配置好的MySQL数据库,而是想使用一些嵌入式数据库,如H2。目前我有一个application.properties文件,它看起来像这样:

spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=qwerty123

问题: 如何配置我的应用程序以在测试中使用其他数据库?我的项目中没有xml,一切都基于注释。我尝试定义一个带有 @Bean@Configuration 类来创建 DataSource,然后在测试类上使用 @ContextConfiguration 注释来使用它,但它显示无法加载上下文。

3个回答

16
如果您正在使用Maven项目,您可以将application.properties文件添加到您的src/test/resources中,例如,可以包含以下内容。
# Create DDL
spring.jpa.hibernate.ddl-auto=create

# H2 in local file system allowing other simultaneous connections
spring.datasource.url=jdbc:h2:~/test;AUTO_SERVER=TRUE

此外,您需要将H2作为依赖项包含在pom.xml中:

<dependency>
   <groupId>com.h2database</groupId>
   <artifactId>h2</artifactId>
   <version>1.4.193</version>
</dependency>

如果我这样做,它仍然使用MySQL数据库。我应该在测试类中提供更多信息吗?是否需要一些注释来明确定义这些属性,而不是来自“main”文件夹的属性? - Leonid Bor
好的,我为测试类添加了@PropertySource("path/to/properties")注解,现在它可以工作了,谢谢。 - Leonid Bor

11
Spring Boot提供了两个与JPA自动配置相关的神奇注释:@DataJpaTest和@AutoConfigureTestDatabase。 javadoc说:
默认情况下,使用@DataJpaTest注释的测试将使用内存中的嵌入式数据库(替换任何显式或通常自动配置的DataSource)。可以使用@AutoConfigureTestDatabase注释来覆盖这些设置。
如果您想加载完整的应用程序配置,但使用嵌入式数据库,则应考虑@SpringBootTest结合@AutoConfigureTestDatabase而不是此注释。
因此,您唯一需要的就是在pom文件中添加依赖项:
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>test</scope>
    </dependency>

这就是全部内容了。然而,Spring Boot规范还有两个有用的注意事项:
1. {{您无需提供任何连接URL}}。您只需要包含要使用的嵌入式数据库的构建依赖项。如果您在测试中使用此功能,则可能会注意到同一数据库被整个测试套件重复使用,而不管您使用的应用程序上下文数量如何。如果您想确保每个上下文都有一个单独的嵌入式数据库,则应将spring.datasource.generate-unique-name设置为true。
2. 另一个注意事项是:如果出于任何原因,您配置了嵌入式数据库的连接URL,请务必确保禁用数据库的自动关闭。如果您使用H2,则应使用DB_CLOSE_ON_EXIT=FALSE来禁用自动关闭。如果您使用HSQLDB,则应确保不使用shutdown=true。禁用数据库的自动关闭使Spring Boot控制何时关闭数据库,从而确保在不再需要访问数据库时仅关闭它。
这几乎是关于Spring Boot和嵌入式数据库的所有内容。除非您真正有意为应用程序运行时配置嵌入式数据库,否则我认为没有理由使用除test之外的依赖范围。信不信由你,H2 jar本身就占据着您的fat jar内部的1.8M。在微粒化的微服务、无服务器和Lambda函数的世界中,您放置在应用程序中的内容确实很重要。
我建议您检查@AutoConfigureTestDatabase中的选项。 我在@SpringBootTest中使用它,但也可以与其他一些注释一起使用,即@DataJpaTest,这两个都在上面提到: enter image description here

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接