java - 初始化数据库以在 Spring Data R2DBC 上进行测试

标签 java spring spring-data-r2dbc r2dbc r2dbc-postgresql

在非测试环境中,我可以像这样使用 schema.sql 设置 bean 来初始化数据库

    @Bean
    ConnectionFactoryInitializer initializer(@Qualifier("connectionFactory") ConnectionFactory connectionFactory) {

        ConnectionFactoryInitializer initializer = new ConnectionFactoryInitializer();
        initializer.setConnectionFactory(connectionFactory);
        initializer.setDatabasePopulator(new ResourceDatabasePopulator(new ClassPathResource("schema.sql")));

        return initializer;
    }

问题是,我想做这样的事情,但出于测试目的。我正在尝试对数据库进行某种集成测试,因此我也希望将模式插入到虚拟数据库中。

我试过使用这个注解,但它仍然不会执行

@Sql(scripts = "classpath:schema.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)

我在包含此属性值的测试资源文件夹中创建了一个单独的application-test.properties

spring.r2dbc.url=r2dbc:postgresql://localhost:5432/test
spring.r2dbc.username=postgres

logging.level.org.springframework.r2dbc=DEBUG

并添加了 @ActiveProfiles(profiles = "test") 注释。

最佳答案

我来这里是为了寻找这个问题的答案。创建了一个加载 test-data.sql 文件的 TestDBInitializer bean,但即使使用 @Profile 注释也无法正常工作。我发现一个更简洁但不理想的解决方案是使用 @Import({ MyTestDbInitializer.class }) ,如下所示:

@DataR2dbcTest
@Import({ TestDBInitializerConfig.class })
class R2dbcTest {
    
    @Autowired
    private MyRepository repository;

    @Test
    void testSomething() {
        Flux<MyEntity> fluxResult = this.repository.findAll();
        
        StepVerifier.create(fluxResult)
            // do things...
            .thenConsumeWhile(x -> true)
            .expectComplete()
            .log()
            .verify();
    }
}

@Configuration
@Profile("test")
public class MyTestDbInitializer {

    @Bean
    public ConnectionFactoryInitializer testProfileInitializer(ConnectionFactory connectionFactory) {

        ConnectionFactoryInitializer initializer = new ConnectionFactoryInitializer();
        initializer.setConnectionFactory(connectionFactory);

        CompositeDatabasePopulator populator = new CompositeDatabasePopulator();
        populator.addPopulators(new ResourceDatabasePopulator(new ClassPathResource("schema.sql"), new ClassPathResource("test-data.sql")));
        initializer.setDatabasePopulator(populator);

        return initializer;
    }
}

仍在寻找不需要任何手动初始化或使用 @Import 注释的答案。

关于java - 初始化数据库以在 Spring Data R2DBC 上进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65351356/

相关文章:

java - Jackson:使用类方法序列化 POJO

spring-boot - WebFlux 和 Kotlin 在多模块应用程序中使用 ReactiveCrudRepository

java.lang.Integer 无法在 R2DBC mysql 模型类中转换为类 java.lang.Long

spring-boot - 在内存数据库中使用时出现 R2dbc H2 问题

java - Head First Android 开发 - RSS 提要

java - 使用Gradle导入spring-integration-kafka时出错

java - Controller 映射到某些功能在部署的 Spring Boot 应用程序中不起作用

java - Autowiring 时始终提供接口(interface)?

java - 在 JDBC for Oracle 中设置客户端信息

java - 将科学计数法转换为十进制计数法