初始化数据库以在spring数据r2dbc上进行测试

svmlkihl  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(522)

在非测试环境中,我可以将bean设置为使用 schema.sql 这样地

@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") 还有注解。

0wi1tuuw

0wi1tuuw1#

我发现这是准备数据库测试环境的最简单方法

private void initializeDatabase() {
    ConnectionFactory connectionFactory = ConnectionFactories.get(dbUrl);
    R2dbcEntityTemplate template = new R2dbcEntityTemplate(connectionFactory);
    String query = "CREATE TABLE IF NOT EXISTS member (id SERIAL PRIMARY KEY, name TEXT NOT NULL);";
    template.getDatabaseClient().sql(query).fetch().rowsUpdated().block();
  }

并在 @Before 要在测试上运行的注解
例如,这就是我的结局

@BeforeEach
  public void setup() {
    initializeDatabase();
    insertData();
  }

  private void initializeDatabase() {
    ConnectionFactory connectionFactory = ConnectionFactories.get(dbUrl);
    R2dbcEntityTemplate template = new R2dbcEntityTemplate(connectionFactory);
    String query = "CREATE TABLE IF NOT EXISTS member (id SERIAL PRIMARY KEY, name TEXT NOT NULL);";
    template.getDatabaseClient().sql(query).fetch().rowsUpdated().block();
  }

  private void insertData() {
    Flux<Member> memberFlux = Flux.just(
        Member.builder().name("Andrew").build(),
        Member.builder().name("Bob").build(),
        Member.builder().name("Charlie").build(),
        Member.builder().name("Dave").build()
    );
    memberRepository.deleteAll()
        .thenMany(memberFlux)
        .flatMap(memberRepository::save)
        .doOnNext(member -> log.info("inserted {}", member))
        .blockLast();
  }
tvokkenx

tvokkenx2#

我想 @Sql 现在只适用于jdbc。
要针对测试目的数据库测试r2dbc,请考虑testcontainers,它允许您在运行测试时在docker中启动数据库。testcontainers本身与springboot和r2dbc有很好的集成。

spring.r2dbc.url=r2dbc:tc:postgresql:///databasename?TC_IMAGE_TAG=12

注:有一个特殊的 tc 在url字符串中。
将相关依赖项添加到pom.xml中。不要忘记将相关的jdbc驱动程序添加到测试范围中。r2dbc testcontainers连接测试需要它。
然后使用 @DataR2dbcTest 测试r2dbc相关代码。

@DataR2dbcTest()
@Slf4j
public class PostRepositoryTest {}

完整的例子,检查这里。

相关问题