如何提供嵌入式数据库供 Mockito 使用?
Posted
技术标签:
【中文标题】如何提供嵌入式数据库供 Mockito 使用?【英文标题】:How provide embedded DB to used by Mockito? 【发布时间】:2021-11-05 10:30:10 【问题描述】:您好,我是新的 Mockito 框架,正在尝试为我的 spring-boot 应用程序编写一些单元测试。 我模拟了我的服务,所以每次 Mockito 运行时,它都使用一些空的模拟数据库,我想使用一些准备好的嵌入式数据库,让我解释一下用例。 我有一个实体,比如说 EntityX。
@Entity
@Table(name = "ENTITYX")
public class EntityX
private long id;
// Some other properties
我创建了它的存储库,我有一个定义方法流程的服务,该方法接受 entityId 的参数并从 DB 中获取该实体,如下所示。
@Service
public class MyService
@Autowired
EntityXRepository repository;
public Object process(long entityId)
EntityX entity = repository.findById(entityId).orElseThrow(()-> new RuntimeException("No Entity found with id "+entityId));
// Does some operation with entity object.
...
return someObject;
现在在我的单元测试中,我正在使用 @Mock 和调用 process(someid); 来模拟我的服务;但处理方法总是抛出异常,因为在模拟数据库中不存在someid
的实体。插入 EntityX 表超出了我的应用程序的范围,所以是否可以向 Mockito 提供一些数据库文件(一些嵌入式数据库文件),以便它可以从提供的数据库记录而不是空数据库开始?
【问题讨论】:
【参考方案1】:如果您真的想在单元测试中使用数据库,您可以创建一个application-test.properties
文件并针对这个确切的用例使用 h2 数据库。
<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
<scope>test</scope>
</dependency>
为了在你的单元测试中加载测试配置文件,你可以在你的测试类之上使用这个注解。
@ActiveProfiles("test")
为了有插入脚本,您可以在下面的链接中获得更多信息,这将解决在单元测试开始时加载数据库的问题。
H2 in-memory database initialization with data
如果您想避免数据库交互,也只是出于好奇,您可以模拟 EntityXRepository repository;
并使用 mockito 模拟所需的行为。
@SpringBootTest
@ActiveProfiles("test")
class TestService
@MockBean
EntityXRepository repository;
@Test
void test_somescenario_success()
Mockito.when(repository.findById("someId")).thenReturn(someEntityX);
//other mocks, service call and assertions
【讨论】:
以上是关于如何提供嵌入式数据库供 Mockito 使用?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java 应用程序中设置 H2 嵌入式数据库以在小型网络中使用?
gtk(或 gtkmm)3 加宽滚动条以供嵌入式(触摸屏)使用