当前位置: 首页 > 知识库问答 >
问题:

@SpringBootTest需要数据库连接吗?

郎增
2023-03-14

我有一些集成测试,为此我使用Testcontainers。但我突然意识到,当我的应用程序数据库docker容器关闭时,所有其他测试(不包括使用Testcontainers的集成测试)都失败了(甚至是Spring Boot Initializer生成的contextLoads()

我得到:

java.lang.IllegalState异常:未能加载应用上下文在org.springframework.test.context.cache.DefaultCacheAware ContextLoaderDelegate.load上下文(DefaultCacheAware ContextLoaderDelegate.java:132)

造成的:org.springframework.beans.factory.BeanCreation异常:错误创建bean名称'liquibase'定义在类路径资源

[org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]:调用init方法失败;嵌套的异常是liquibase。例外数据库例外:com.mysql。希杰。jdbc。例外。通信异常:通信链路故障

很明显,应用程序想要连接到数据库,而数据库容器已关闭。

我一直在调查,但我不记得只需要为应用程序的测试/构建过程启动容器,所以这个问题对我来说是新问题。但如果有什么地方做错了,它可能在这里,在我的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);
        }
    }

}

集成测试扩展了这个类:

public class ChallengeIT extends AbstractDatabaseIT {

    @Autowired
    private ChallengeRepository repository;

    // tests here

所有其他非集成类都有@SpringBootTest注释,以及使用@Autowired注入的依赖项(这可能是个问题?)

@SpringBootTest
class EthMessageVerifierTest {

    @Autowired
    private EthMessageVerifier ethMessageVerifier;

    // tests here

我错过了什么?我记得在很多项目中都看到了H2数据库的依赖性。我应该放弃测试容器而选择H2吗?或者我可以为所有其他测试创建一个testcontainer实例吗?


共有1个答案

通宾白
2023-03-14

@SpringBootTest注释的测试尝试填充整个Spring上下文。这包括所有bean:Web层、业务逻辑、数据库设置等。

因此,运行整个应用程序所需的所有架构体系(例如消息传递队列、远程系统、数据库)也需要用于此类测试。

所以@SpringBootTest也表示联调,您需要在应用程序启动时提供数据库设置,Spring Boot的自动配置会尝试配置您的DataSource

欲了解更多信息,请参阅本文关于@ SpringBootTest和这个概述单位

 类似资料:
  • 我有一个带hibernate的SpringBoot应用程序。在我的测试中,我想禁用任何类型的数据库连接和配置(测试不能访问数据库)。我该怎么做? 我的测试类是用注释的,并且具有属性。禁用所有数据库交互的正确注释值是多少?

  • 在使用Node.js之前,我只使用过PHP。在使用MYSQL时,我能够在PHP中做的是,我可以将database.PHP文件包含在我想要执行查询的文件中。 在Node.js中似乎不是这样。这是我的database.js文件 那么我需要在我的文件login.js中这样做 但是,当我尝试运行时,我发现db.query不是一个函数。 这是为什么?不应该更复杂还是应该?

  • 我有以下测试: 你能给出解决这个问题的最佳方法吗?我在MapStruct 1.3.1上。决赛

  • 问题内容: 我是Java的新手,甚至还不是Java数据库连接的新手。当我将它放在Main类中时,我设法创建了一个数据库连接并查询了一个表。现在,将其移到名为Connection的新类中,我遇到了错误: 我收到一条错误消息,说找不到符号。符号:方法createStatement()和con = DriveManager .....不可比拟的类型。 有人可以帮忙吗? 另外,最好的做法是将连接放在这样的

  • 连接数据库 在能够对MongDB进行操作之前,需要使用BuguFramework创建一个数据库连接,代码如下: BuguConnection conn = BuguFramework.getInstance().createConnection(); conn.connect("192.168.0.100", 27017, "mydb", "username", "password"); 也可以

  • 一、全局配置定义 return array( 'DB_TYPE' => 'mysql', 'DB_HOST' => '127.0.0.1', 'DB_NAME' => 'thinkcmf', 'DB_USER' => 'root', 'DB_PWD' => 'root', 'DB_PORT' => '3306', 'DB_PREFIX' =>