我有一个Spring启动应用程序,其中嵌入式PostgreSQL用于测试。
<dependency>
<groupId>ru.yandex.qatools.embed</groupId>
<artifactId>postgresql-embedded</artifactId>
<version>2.6</version>
<scope>test</scope>
</dependency>
我正在使用常规的非嵌入式PostgreSQL,然后进行测试。
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.1.4</version>
</dependency>
我现在必须使用JPA依赖和PostgreSQL。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
到目前为止一直很好,但问题是,只要我使用JPA依赖项,我的测试就会开始失败。当我删除JPA依赖项时,测试开始再次运行。我已经调查并发现,当我不使用JPA依赖时,嵌入式PostgreSQL二进制文件将被提取并正确运行并带有消息,
Extract C:\Users\Dev\.embedpostgresql\postgresql-10.1-2-windows-x64-binaries.zip START
在上面的消息之后启动了Flyway迁移但是当使用JPA依赖项时,上面的消息没有显示,因此嵌入式PostgreSQL没有启动,并且启动了Flyway迁移,最终因为没有服务器运行而失败。
这是嵌入式PostgreSQL的JPA依赖的已知问题吗?我试图在网上搜索这样的问题,但找不到任何关于它的东西,我还不是Spring引导的专家(
)。嵌入式PostgreSQL配置类:
import com.myproj.microservice.config.DatasourceConfig;
import groovy.util.logging.Slf4j
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.autoconfigure.AutoConfigureBefore
import org.springframework.context.annotation.Configuration
import ru.yandex.qatools.embed.postgresql.EmbeddedPostgres
import javax.annotation.PostConstruct
import javax.annotation.PreDestroy
import java.sql.Connection
import java.sql.DriverManager
@Configuration
@AutoConfigureBefore(DatasourceConfig.class)
@Slf4j
class EmbeddedPostgresConfig {
private final EmbeddedPostgres postgres = new EmbeddedPostgres()
@PostConstruct
void startAndSetupEmbeddedPostgresql() {
log.debug("Starting Embedded PostqreSQL")
String url = postgres.start('localhost', 1234, 'testDB', 'testUser', 'testUser')
Connection conn = null
try {
// TODO from db init script?
conn = DriverManager.getConnection(url)
conn.createStatement().execute("""CREATE SCHEMA "myDB" AUTHORIZATION "testUser";""")
conn.createStatement().execute("""GRANT ALL ON SCHEMA "myDB" TO "testUser";""")
} finally {
conn?.close()
}
}
@PreDestroy
void stopEmbeddedPostgresql() {
postgres.stop()
}
}