使用嵌入式数据库在spring boot中进行测试

时间:2017-02-21 14:03:04

标签: java mysql spring spring-boot junit

我有一个spring boot应用程序,它有几个@Entity类和@RepositoryRestResource repositort接口。现在我想编写一些测试,在那里我可以检查我是否可以使用这些存储库将新记录添加到我的数据库中,但我不想使用我配置的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,一切都基于注释。我尝试使用@Configuration定义@Bean类以创建DataSource,然后在测试类上使用@ContextConfiguration注释,但它表示无法加载上下文。< / p>

3 个答案:

答案 0 :(得分:15)

如果您使用的是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>

答案 1 :(得分:7)

Spring Boot提供2个与JPA autoconfigs相关的魔术注释:@DataJpaTest@AutoConfigureTestDatabase。 javadoc说:

  

默认情况下,使用@DataJpaTest注释的测试将使用嵌入式   内存数据库(替换任何显式或通常自动配置   数据源)。 @AutoConfigureTestDatabase注释可用于   覆盖这些设置。

     

如果您要加载完整的应用程序配置,但是   使用嵌入式数据库,你应该考虑@SpringBootTest的组合   使用@AutoConfigureTestDatabase而不是此注释。

所以,你唯一需要的是你的pom文件中的依赖:

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

那就是它。但是,spring boot规范还有两个有用的警告:

  

您无需提供任何连接网址。你只需要包括一个   构建对要使用的嵌入式数据库的依赖关系。   如果您在测试中使用此功能,您可能会注意到   无论如何,整个测试套件都会重用相同的数据库   您使用的应用程序上下文的数量。如果你想确定   每个上下文都有一个单独的嵌入式数据库,你应该设置   spring.datasource.generate-unique-name为true。

还有一个:

  

如果出于某种原因,您确实为某个配置了连接URL   嵌入式数据库,注意确保数据库的自动化   关闭已禁用。如果你使用H2,你应该使用   DB_CLOSE_ON_EXIT = FALSE这样做。如果您使用HSQLDB,您应该确保   没有使用shutdown = true。禁用数据库的自动   shutdown允许在数据库关闭时使用 Spring Boot控件   确保在不再访问数据库时发生这种情况   需要

几乎所有关于Spring Boot和嵌入式数据库的知识都是如此。除非您实际上有意为应用程序运行时配置嵌入式数据库,否则我认为没有理由使用test以外的依赖范围。信不信由你的胖罐里面只有1.8毫升的H2罐。在粒度微服务,无服务器和lambda函数的世界中,你在应用程序中放置的内容确实很重要。

我还建议检查@AutoConfigureTestDatabase中的选项。我将它与@SpringBootTest一起使用,但它也可以与其他一些注释一起使用,即@DataJpaTest,两者都在上面提到: enter image description here

答案 2 :(得分:2)

您需要使用Spring Profiles - https://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html#howto-set-active-spring-profiles

您将使用&#34; spring.profiles.active = development&#34;定义活动配置文件。然后在您的开发资料中包含H2。

示例使用YAML,但它们也适用于标准属性文件。