在黄瓜测试模块中使用主应用程序数据源 - Spring-boot 应用程序

Posted

技术标签:

【中文标题】在黄瓜测试模块中使用主应用程序数据源 - Spring-boot 应用程序【英文标题】:Use main application datasource in cucumber test module - Spring-boot application 【发布时间】:2020-12-12 05:30:58 【问题描述】:

我试图在 spring-boot 应用程序的黄瓜测试模块中将数据插入数据库。

当使用测试配置文件 (mvn spring-boot:run -Dspring-boot.run.profiles=test) 启动 spring 应用程序时,它会启动应用程序并正常运行。问题是在黄瓜测试执行期间尝试设置datasource(如下面代码中指出的**行)它为空。那么我应该再次设置数据源吗?如果有怎么办。

这不是黄瓜测试相关的问题,问题是我无法访问在主应用程序中设置的数据源。

下面是代码

    @ContextConfiguration(classes = MainApp.class, loader = SpringBootContextLoader.class)
    @ActiveProfiles("test")
    @Configuration
    @PropertySource("classpath:create-sql.xml")
    public class TestHelper 
    
        @Value("$CreateSql")
        private String CreateSql;

        @Autowired
        private SqlQueryBuilder sqlQueryBuilder;
    
        @Autowired
        private NamedParameterJdbcTemplate jdbcTemplate;
    
        @Autowired
        private UserPreferenceFormatter formatter;
    
        @Autowired
        private DataSource dataSource;
    
    public static void getDataList() throws IOException 

            MapSqlParameterSource sqlParamSource = new MapSqlParameterSource();
            sqlQueryBuilder = new SqlQueryBuilder();
    
            jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); ****
    
            String parsedSql = sqlQueryBuilder.parseSql(CreateSql,null,null,null);
            List<DataSummary> dataSummaries = jdbcTemplate.query(parsedSql, sqlParamSource, new DataSummaryRowMapper(null,formatter));
        

资源文件夹下的application-test.yml文件,包含测试模块中的所有spring数据源

app-db-url: jdbc:oracle:....
app-db-user: USERNAME
spring:
  datasource:
    password: PWD

我也经历了以下解决方案

Solution-1

Solution-2

部署模块app-config.yml

....
data:
    # Database
    app-db-url : @@app-db-url@@
    app-db-user: @@app-db-user@@
......

【问题讨论】:

您不能自动装配静态字段。 @DirkDeyne 我更改了代码以使所有内容都非静态。结果还是一样。 其他疑问是,这是由于测试模块资源文件夹下application-test.yml 的访问问题。我们如何验证这一点? 进一步根据***.com/questions/38711871/… 中的建议更改了代码(也更新了问题 sn-ps)。不过运气不好 顺便说一句,这种方法有意义吗?因为主要应用程序是spring-boot 而我的测试项目是黄瓜。那么@Autowire 会用上面的代码加载这些实例吗? 【参考方案1】:

您似乎缺少定义该 DataSource bean 的代码。 你应该有这样的东西:

@Configuration
public class DataSourceConfig 
    
    @Bean
    public DataSource getDataSource() 
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("org.h2.Driver");
        dataSourceBuilder.url("jdbc:h2:mem:test");
        dataSourceBuilder.username("SA");
        dataSourceBuilder.password("");
        return dataSourceBuilder.build();
    

或类似的东西:

@Bean 
public DataSource getDataSource()  
    DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); 
    dataSourceBuilder.username("SA"); 
    dataSourceBuilder.password(""); 
    return dataSourceBuilder.build(); 

其余的属性可以进入属性文件。

【讨论】:

我的想法是在测试项目中使用现有的主 spring-boot 项目数据库类。正如我在之前的 cmets 中提到的,我的疑问是,由于测试项目不是 spring-boot 项目(它具有 POJO 类),因此可以按照我在问题中的代码使用。所以我只需要单独的application.yml 就可以拥有所需的属性。您在上面提到的答案将起作用,因为它使用单独的 bean 进行数据库连接。 进一步,即使在实现了您提到的 DataSourceBean 之后,我也无法访问问题代码中指定的 CreateSql xml。它是空的。目前该 xml 文件位于主应用程序资源文件夹下。理想情况下,它需要移动到测试项目文件夹,因为它不是主应用程序的一部分。 dataSource = new DataSourceBean();jdbcTemplate = new NamedParameterJdbcTemplate(dataSource1.getDataSource()); 将创建数据源,但正如我所提到的,它不会重新使用主应用程序数据源。它是单独的实现。但我仍然无法访问CreateSql.xml,如上所述评论。

以上是关于在黄瓜测试模块中使用主应用程序数据源 - Spring-boot 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

黄瓜订购给定,何时,然后(给定,何时,然后,何时,然后)

Vue未装入测试(黄瓜/水豚)

我可以通过端点作为 API 运行黄瓜测试吗?

无法从黄瓜测试连接到PostgreSQL

用黄瓜/水豚测试 ActiveMerchant

如何在不重复场景的情况下在黄瓜测试中编写功能?