【问题标题】:Spring test: configure datasource for org.springframework.test.context.jdbc.SqlSpring测试:为org.springframework.test.context.jdbc.Sql配置数据源
【发布时间】:2019-05-06 14:56:30
【问题描述】:

在我的 Spring Boot 项目中,我有两个 数据源

    @Primary
    @Bean(name = "pgDatasource")
    public BasicDataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(env.getProperty("spring.datasource.dbcp2.driver-class-name"));
        dataSource.setUrl(env.getProperty("spring.datasource.dbcp2.url"));
        dataSource.setUsername(env.getProperty("spring.datasource.dbcp2.username"));
        dataSource.setPassword(env.getProperty("spring.datasource.dbcp2.password"));
        dataSource.setMaxActive(Integer.valueOf(env.getProperty("spring.datasource.dbcp2.max-total")));
        dataSource.setMaxIdle(Integer.valueOf(env.getProperty("spring.datasource.dbcp2.max-idle")));
        dataSource.setInitialSize(Integer.valueOf(env.getProperty("spring.datasource.dbcp2.initial-size")));
        return dataSource;
    }

    @Bean(name = "h2Datasource")
    public BasicDataSource h2DataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(env.getProperty("spring.h2.datasource.driver-class-name"));
        dataSource.setUrl(env.getProperty("spring.h2.datasource.url"));
        dataSource.setUsername(env.getProperty("spring.h2.datasource.username"));
        dataSource.setPassword(env.getProperty("spring.h2.datasource.password"));

        Resource initData = new ClassPathResource("scripts/inmem.sql");
        DatabasePopulator databasePopulator = new ResourceDatabasePopulator(initData);
        DatabasePopulatorUtils.execute(databasePopulator, dataSource);

        return dataSource;
    }

这里的 PostgreSQL 数据源是一个主 bean。在我的几个测试中,我想针对 h2 数据库运行一个脚本。为此,我正在尝试使用 @Sql 注释。但是,如果我使用@Sql,它会针对pgDatasource 运行脚本。我可以将 h2 配置为这些测试的主 bean,但测试方法的主体取决于 pgDatasource 是主 bean 的配置。

测试样本

@Test
@Sql(scripts = "/clean_login_attempts.sql", executionPhase = AFTER_TEST_METHOD)
void loginAttemptsIncrementTheCount() throws Exception {
    unsuccessfulLoginRequest();
    unsuccessfulLoginRequest();
    unsuccessfulLoginRequest();

    LoginAttempt loginAttempt = loginAttemptService.getAttempt("admin");
    assertEquals(3, loginAttempt.getAttempt());
}

是否可以为org.springframework.test.context.jdbc.Sql注解配置数据源?

【问题讨论】:

    标签: java spring-boot mockito integration-testing junit5


    【解决方案1】:

    添加 config = @SqlConfig(dataSource = "h2Datasource", transactionManager = "h2tx") 解决了这个问题。

    @Test
    @Sql(scripts = "/clean_login_attempts.sql", executionPhase = AFTER_TEST_METHOD, config = @SqlConfig(dataSource = "h2Datasource", transactionManager = "h2tx"))
    void loginAttemptsIncrementTheCount() throws Exception {
        unsuccessfulLoginRequest();
        unsuccessfulLoginRequest();
        unsuccessfulLoginRequest();
    
        LoginAttempt loginAttempt = loginAttemptService.getAttempt("admin");
        assertEquals(3, loginAttempt.getAttempt());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-01
      • 2015-03-21
      • 1970-01-01
      • 2021-02-16
      • 2011-05-10
      • 2018-08-04
      • 2016-01-17
      • 2015-01-26
      相关资源
      最近更新 更多