在使用Spring Boot和Flyway时遇到的问题

首先

尝试使用JDBC在Spring Boot的Web应用程序中使用PostgreSQL,并尝试添加Flayway。

    1. 结果,之前能够正常运行的测试用例突然全部失败了。(需要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。

广告
将在 10 秒后关闭
bannerAds