如何提供嵌入式数据库供 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 加宽滚动条以供嵌入式(触摸屏)使用

亿级用户的平台是如何使用词嵌入来建立推荐系统的

如何将 Bert 嵌入提供给 LSTM

如何将 UITextView 嵌入 UITableViewCell 与作为委托的自定义单元格?

Swift 包管理器 - 如何“始终嵌入 Swift 标准库”?