在使用Spring Boot和Flyway时遇到的问题
首先
尝试使用JDBC在Spring Boot的Web应用程序中使用PostgreSQL,并尝试添加Flayway。
-
- 结果,之前能够正常运行的测试用例突然全部失败了。(需要H2Database)
- 为了使用PostgreSQL来执行测试用例,需要进行Contextinitializer的设置。
上述的两点备忘录。目标的Web应用程序是使用Spring Boot + Apache Wicket (2)开发的,几乎等同于之前的版本。
为了使用Flyway,我所做的事情。
修改pom.xml文件。Spring Boot会自动设置flayway-core的版本。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.3-1102-jdbc41</version>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
接下来将RDB的配置导入Spring Boot。在这种情况下,可以在application.properties文件中进行配置。
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/foo
spring.datasource.username=bar
spring.datasource.password=baz
只需在src/main/resources中创建db.migration文件夹,并放置用于Flyway的SQL文件。非常简单。
-- For example...
create table books (
isbn text primary key,
book_name text not null,
);
当使用Spring Boot启动时,它会在RDB(PostgreSQL)的foo数据库中生成books表,并且根据Flyway规则新增SQL文件时,会完成迁移的机制将被配置好。
卡住了的问题1:测试用例无法运行
“哎呀,很容易就導入了,太好了太好了!”他心情愉悅地執行測試案例,結果全部都失敗了,他陷入了紅色的世界。
当我查看错误日志时,里面写了很多东西,
由于: org.springframework.beans.factory.BeanCreationException: 无法确定数据库类型为NONE的嵌入式数据库驱动程序类。如果您想要一个嵌入式数据库,请将一个可支持的数据库加入到类路径中。
被称为「怪异」的言论令人怀疑。
如果使用此关键词进行搜索,会发现一个关于Spring Boot – Cannot determine embedded database driver class for database type NONE的问题,解决方法是在pom.xml中添加h2database依赖。
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
如果我将H2database添加到pom.xml中,那么… (Translation: If I add H2database to pom.xml, then…)
INFO --- [ main] o.f.c.i.dbsupport.DbSupportFactory : Database: jdbc:h2:mem:testdb (H2 1.4)
INFO --- [ main] o.f.core.internal.command.DbValidate : Validated 1 migration (execution time 00:00.019s)
INFO --- [ main] o.f.c.i.metadatatable.MetaDataTableImpl : Creating Metadata table: "PUBLIC"."schema_version"
INFO --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema "PUBLIC": << Empty Schema >>
INFO --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema "PUBLIC" to version 1.0
INFO --- [ main] o.f.core.internal.command.DbMigrate : Successfully applied 1 migration to schema "PUBLIC" (execution time 00:00.045s)
就像这样,测试用例已经改为(在运行时执行flyway并且)正常结束了。
在进行Spring Boot中使用flyway的项目测试时,似乎默认将jdbc:h2:mem:testdb设置为spring.datasource.url。(我对Spring不太熟悉,所以不太确定)
想要在PostgreSQL上进行测试时,该怎么做呢?
我想让他们在测试时使用PostgreSQL而不是H2database,并且我找到了参考指南,上面写着如果使用ConfigFileApplicationContextInitializer就可以了。
如果在测试案例的ContextConfigration中指定ConfigFileApplicationContextInitializer.class,似乎在运行测试时能够加载application.properties文件。
为此,我们需要一个测试用例类。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { WebInitializer.class, WicketApplication.class })
public class FooTest {
...
设置该注释的配置
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
classes = { WebInitializer.class, WicketApplication.class },
initializers = ConfigFileApplicationContextInitializer.class)
public class FooTest {
...
经过修改。同时删除了pom.xml中的h2database依赖项。尝试运行一下,
INFO --- [ main] o.f.c.i.dbsupport.DbSupportFactory : Database: jdbc:postgresql://localhost:5432/foo (PostgreSQL 9.4)
INFO --- [ main] o.f.core.internal.command.DbValidate : Validated 1 migration (execution time 00:00.023s)
INFO --- [ main] o.f.c.i.metadatatable.MetaDataTableImpl : Creating Metadata table: "public"."schema_version"
INFO --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema "public": << Empty Schema >>
INFO --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema "public" to version 1.0
INFO --- [ main] o.f.core.internal.command.DbMigrate : Successfully applied 1 migration to schema "public" (execution time 00:00.064s).
在没有问题的情况下,在测试时,我们可以读取application.properties文件中的值,并且开始使用PostgreSQL。