在黄瓜测试模块中使用主应用程序数据源 - 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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章