dzi*_*iki 3 java junit spring spring-boot testcontainers
我有一些集成测试,我正在使用测试容器。但我突然意识到,当我的应用程序的带有数据库的 docker 容器关闭时,所有其他测试(不包括使用 Testcontainers 的集成测试)都会失败(甚至是contextLoads()Spring Bootinitializr 生成的测试)
我得到:
java.lang.IllegalStateException:无法在org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132)加载ApplicationContext
导致:org.springframework.beans.factory.BeanCreationException:创建类路径资源中定义的名称为“liquibase”的bean时出错
[org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]:调用init方法失败;嵌套异常是 liquibase.exception.DatabaseException: com.mysql.cj.jdbc.exceptions.CommunicationsException: 通信链接失败
很明显应用程序想要连接数据库,而数据库容器宕机了。
我一直在调查,但我不记得曾经需要仅为应用程序的测试/构建过程启动容器,所以这个问题对我来说是新问题。但如果有什么地方做错了,也可能是在我的AbstractDatabaseIT课堂上:
@ActiveProfiles("test")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@ContextConfiguration(initializers = AbstractDatabaseIT.DockerMySqlDataSourceInitializer.class)
@Testcontainers
public abstract class AbstractDatabaseIT {
private static final String MYSQL_IMAGE_NAME = "mysql:5.7.24";
public static final MySQLContainer<?> mySQLContainer = new MySQLContainer<>(MYSQL_IMAGE_NAME);
static {
mySQLContainer.start();
}
public static class DockerMySqlDataSourceInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(@NotNull ConfigurableApplicationContext applicationContext) {
Map<String, String> parameters = new HashMap<>();
parameters.put("command", "--character-set-server=utf8");
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(
applicationContext,
"spring.datasource.url=" + mySQLContainer.getJdbcUrl(),
"spring.datasource.username=" + mySQLContainer.getUsername(),
"spring.datasource.password=" + mySQLContainer.getPassword()
);
mySQLContainer.setParameters(parameters);
}
}
}
Run Code Online (Sandbox Code Playgroud)
集成测试扩展了这个类:
public class ChallengeIT extends AbstractDatabaseIT {
@Autowired
private ChallengeRepository repository;
// tests here
Run Code Online (Sandbox Code Playgroud)
所有其他非集成类都有@SpringBootTest注释,并且使用 @Autowired 注入依赖项(也许这是这里的问题?)
@SpringBootTest
class EthMessageVerifierTest {
@Autowired
private EthMessageVerifier ethMessageVerifier;
// tests here
Run Code Online (Sandbox Code Playgroud)
我在这里缺少什么?我记得在许多项目中都看到过 H2 数据库依赖关系。我应该放弃测试容器而选择 H2 吗?或者我可以以某种方式为所有其他测试创建一个测试容器实例吗?
您注释的测试@SpringBootTest尝试填充整个 Spring 上下文。这包括您的所有 Bean:您的 Web 层、您的业务逻辑、您的数据库设置等。
因此,运行整个应用程序所需的所有基础设施(例如消息队列、远程系统、数据库)也需要用于此类测试。
因此@SpringBootTest也表示集成测试,您需要在应用程序启动时提供数据库设置,Spring Boot 的自动配置会尝试配置您的DataSource.
有关更多信息,请考虑有关@SpringBootTest 的这篇文章以及有关 Spring Boot 的单元和集成测试的一般概述。您并不总是必须使用并且也可以使用 S spring Boots 许多测试切片注释@SpringBootTest之一来单独测试某些内容。
| 归档时间: |
|
| 查看次数: |
5032 次 |
| 最近记录: |