我在使用JUnit 5附带的Sping Boot 运行测试时遇到了一个问题。我的应用程序连接到云中的数据源。但是,当我运行测试时,测试失败,原因之一是:我已将数据源文件设置为接受环境变量,并且未在中硬编码数据源(将通过docker-compose文件发送)。有没有办法在测试时在内存中创建一个假的数据库?我该怎么做呢?我也在尝试通过模拟我的数据库来测试。
www.example.comTest.java主文件
package com.legacybanking.legacyBankingAPI;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
@SpringBootTest
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
class LegacyBankingApiApplicationTests {
@Test
void contextLoads() {
}
}
数据源
spring.datasource.url=${SPRING_DATASOURCE_URL}
spring.datasource.username=${SPRING_DATASOURCE_USERNAME}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD}
spring.jpa.hibernate.ddl-auto=${SPRING_JPA_HIBERNATE_DDL_AUTO}
spring.jpa.show-sql=${SPRING_JPA_SHOW_SQL}
spring.jpa.properties.hibernate.dialect=${SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT}
spring.jpa.properties.hibernate.format_sql=${SPRING_JPA_PROPERTIES_HIBERNATE_FORMAT_SQL}
1条答案
按热度按时间92vpleto1#
当然有!如果你想要“真实的的东西”--那就是一个真正的数据库来运行你的查询,我会选择testcontainers。它们需要在你的机器上安装和运行一个Docker demon,但除此之外,它们是一个提供测试依赖关系(数据库、消息队列、Kafka,你能想到的)的好方法,并且在你的测试用例中很容易安装和拆卸。
或者,您可以为您的集成(Spring对术语“集成”的含义)测试提供一个专用的配置文件,并使用Spring配置文件特性简单地示例化您的存储库的In-Memory版本,这些版本根本不需要DB-您可以编写自己的fakes,将所有数据保存在内存中。
这两种方法都有其优缺点。在docker环境中运行真实的数据库是一种重量级的方法,与使用内存中的fake相比,测试速度较慢。优点是,你是在对真实数据库进行真实查询,如果你的查询有错误,你会知道这一点。此外,开发和维护测试fake需要一些时间和精力,所以这里有一个权衡。
TL;DR - checkout testcontainers和Martin Fowler的文章-选择最适合您需要的内容。