如何自动初始化DB schema,关于spring Boot + eclipselink + postgresql集成测试

bd1hkmkf  于 2023-05-06  发布在  Spring
关注(0)|答案(2)|浏览(188)

我正在尝试为我的Java 11,spring Boot + eclipselink + postgresql应用程序设置一个集成测试框架。我每次都使用docker-maven-plugin来派生一个新的postgresql DB容器,并且使用maven-failsafe-plugin运行集成测试。除了DB模式初始化之外,这种方法都很好:我无法初始化那个模式。
下面是我的application-it.yaml的样子:

# Graceful shutdown delay            
application:
  shutdownhook:
    delay-msec: 500

# Spring Boot management endpoint configuration           
management:
  port: 9199
  info:
    git:
      mode: full
      
# Spring Boot enpoints Management endpoint        
endpoints:
  metrics:
    sensitive: false
  env:
    sensitive: false
  health:
    enabled: false

# short value just for testing 
estaGracefulShutdownWaitSeconds: 5

# Application-specific configuration
sample-application:
  server-name: Sample App Under Test

logging:
  config: classpath:log4j2-spring.xml

spring:
  datasource:
    platform: postgresql
    url: jdbc:postgresql://localhost:${it-database.port}/postgres
    username: postgres
    password: postgres
    schema: classpath:schema-it.sql
    data: classpath:data-it.sql
    driver-class-name: org.postgresql.Driver
    initialization-mode: always

schema-it.sql和data-it.sql可以在类路径中使用。在IT运行期间,没有报告有关其执行的错误。但是模式仍然没有被创建(我知道,因为首先IT测试失败,抱怨任务表丢失,我能够访问测试数据库,我可以看到那里没有创建表)。
单元测试看起来像这样:

@RunWith(SpringRunner.class)
@ActiveProfiles("it")
@SpringBootTest
public class TaskRepositoryIT {
    @Autowired
    private TaskRepository taskRepository;

    @Test
    public void testGetTasks() {
        List<Task> tasks = taskRepository.findAll();
        Assert.assertTrue(tasks.isEmpty());
    }
    
}

有没有办法让spring基于schema-it.sql内容生成schema,然后用data-it.sql数据填充它?
谢谢

6g8kf2rb

6g8kf2rb1#

尝试使用@Sql注解,它提供了在执行测试时从.sql文件填充数据库的方法。你应该像下面的代码片段那样使用它:

@RunWith(SpringRunner.class)
@ActiveProfiles("it")
@SpringBootTest
@Sql({"/schema-it.sql", "/schema-it.sql"})
public class TaskRepositoryIT {

    @Autowired private TaskRepository taskRepository;

    @Test
    public void testGetTasks() {
        List<Task> tasks = taskRepository.findAll();
        Assert.assertTrue(tasks.isEmpty());
    }
}
5n0oy7gb

5n0oy7gb2#

找到我的问题了问题在于.sql文件名。

schema: classpath:schema-it.sql
data: classpath:data-it.sql

正确的名字应该是:

schema: classpath:schema-postgresql.sql
data: classpath:data-postgresql.sql

因为platform设置为postgresql。

相关问题