java - 如何在现有应用程序中使用测试容器?
问题描述
语境:
我有一个现有的 Camel 应用程序。为了使用 Spring Boot 工具对其进行测试,它被包装到 Spring Boot 框架中,并且所有测试都针对这个Spring Boot
应用程序运行。重要提示:此代码用于生产,因此我不能完全更改实现和重写测试。为了在我使用的类似 prod 的环境testcontainers
和 Docker 中的 Microsoft SQL Server 中测试应用程序,它是一个附加的功能测试模块。
我要做的是启动testcontainers
和更新DataSource
,因此它将指向 SQL Server 端点。我遇到了一系列永无止境的问题。我究竟做错了什么?
问题:
我的SpringBootTestApplication
样子:
@SpringBootApplication
public class SpringBootTestApplication {
@Bean(name = "myDataSource")
public DataSource dataSource() throws ClassNotFoundException {
SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
dataSource.setDriverClass(Class.forName("org.apache.derby.jdbc.EmbeddedDriver").asSubclass(Driver.class));
dataSource.setUrl("jdbc:derby:memory:testdb;create=true");
dataSource.setUsername("sa");
dataSource.setPassword("");
Resource initSchema = new ClassPathResource("db/schema.sql");
ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(initSchema);
databasePopulator.setIgnoreFailedDrops(true);
DatabasePopulatorUtils.execute(databasePopulator, dataSource);
return dataSource;
}
public static void main(String[] args) {
SpringApplication.run(SpringBootTestApplication.class, args);
}
}
我的测试看起来是这样的:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringBootTestApplication.class)
@TestPropertySource("classpath:application-test.properties")
public class LargeDatabaseRetrieverTest {
@Rule
public MSSQLServerContainer mssqlServerContainer = (MSSQLServerContainer) new MSSQLServerContainer()
.withInitScript("db/test-data-mssql.sql")
.withExposedPorts(1433);
@Autowired
@Qualifier("myDataSource")
private DataSource dataSource;
@Before
public void setUp() throws Exception {
mssqlServerContainer.start();
DataSource mssqlDataSource = configureDataSource();
AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
factory.autowireBean(mssqlDataSource);
}
@After
public void tearDown() throws Exception {
mssqlServerContainer.stop();
}
private DataSource configureDataSource() {
BasicDataSource basicDataSource = new BasicDataSource();
basicDataSource.setDriverClassName(mssqlServerContainer.getDriverClassName());
basicDataSource.setUrl(mssqlServerContainer.getJdbcUrl());
basicDataSource.setUsername(mssqlServerContainer.getUsername());
basicDataSource.setPassword(mssqlServerContainer.getPassword());
return basicDataSource;
}
@Test
public void test() {
// Use DataSource in here
}
}
我正在尝试动态加载DataSource
到测试中,因此我将针对 MS SQL Server 进行测试,而不是针对默认的内存配置进行测试。
问题是我不知道 MS SQL Server Docker 容器的配置,直到它启动,我无法动态注入我自己的 DataSource 实现。
尝试的解决方案列表:
- 动态配置数据源
- 在 Configuration 中重新定义默认 @Bean 并使用 @Import 加载
- 创建具有不同限定符的附加 bean
- 用于
BeanPostProcessor
重新加载 bean
以上解决方案均无效。我好像做错了什么,在三棵白桦树之间迷路了。我究竟做错了什么?
解决方案
您是否检查过Spring Boot 的文档以了解如何将其与 Testcontainers 一起使用?还是Testcontainers 的 Spring Boot 示例?
还有一个车间。
最后但同样重要的是,如果您只需要一个 SQL 数据库,您可以使用JDBC URL 支持。
推荐阅读
- c++ - CMake链接器输入文件未使用,因为链接未完成
- python - 如何从当前循环访问循环中的下一个字典值?
- laravel - 向新用户发送带有令牌的电子邮件以在 Laravel 中创建帐户
- python - 如何切片任何列表的三个中间索引?
- flutter - 如何使用 iOS 主题运行 Flutter 应用程序(外观、行为)
- typescript - 打字稿泛型相关
- c# - 在 Visual Studio 中使用 CMD 和 C# 脚本的 MSDEPLOY
- flutter - 可拖动小部件阻止滚动手势
- sql - 根据其他列过滤与日期/时间相关的列
- javascript - 如何防止使用Javascript在输入中输入除数字以外的其他字符