Spring4 JUnit测试:将SQL加载到H2 db

时间:2015-02-28 15:31:43

标签: java spring junit spring-test

我正在尝试为Spring Boot(Spring 4)应用程序编写测试。

我的Junit测试类配置如下,以允许自动装配。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = SpringApp.class)
public class MyServiceTest {
...

我的src/main/resources/application.properties就像这样

spring.jpa.database=POSTGRESQL
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=update

spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost/mydb
spring.datasource.username=BNF0016779
spring.datasource.password=

在测试环境中,src / test / resources / application.properties只是空的。

In可以照常查询数据库,创建对象......

但我想创建一个数据init sql。

从一个奇怪的行为开始,Spring似乎加载了任何" schema.sql"在classpath中。 不需要像下面这样的东西吗?

//This is not required to execute schema.sql
@Configuration
public class DatabaseTestConfig {
    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.H2)
            .addScript("classpath:schema.sql")
            .build();
    }
}

然后,我无法从此SQL创建任何表。 始终收到org.h2.jdbc.JdbcSQLException: Table "MY_TABLE" already exists; SQL statement:

H2应该是内存中的数据库,两次启动之间不保存数据! 为什么我会收到这些错误?

有什么想法吗? 感谢

2 个答案:

答案 0 :(得分:7)

Spring Boot实际上默认会在类路径的根目录中执行名为schema.sql的文件。此外,Spring Boot还将自动为您的应用程序创建一个嵌入式数据库,除非您另外指示它。咨询" Initialize a database using Spring JDBC"有关详细信息,请参阅Spring Boot参考手册的部分。

  

H2应该是内存中的数据库,不保存两者之间的数据   启动!

是和否。

如果Spring Boot为您创建了一个嵌入式H2数据库,那么它将是 in-memory

但是,数据库实际上是ApplicationContext中的一个bean(就像任何其他Spring管理的组件一样)。因此,只要ApplicationContext存在,就会生存,而 Spring TestContext Framework 会在测试之间缓存上下文:这是其主要功能之一。换句话说,嵌入式数据库将在测试之间重新(除非您使用@DirtiesContext注释测试类或测试方法)。有关详细信息,请参阅Spring Framework参考手册的Context caching部分。

此致

Sam( Spring TestContext Framework的作者

答案 1 :(得分:0)

H2可以在内存中。但我假设它使用的默认DataSource不是。

您可以在DataSourceFactory上设置EmbeddedDatabaseBuilder,以生成与DataSource等网址相关联的jdbc:h2:mem:test