猿问

如何在服务层单元测试中模拟数据库结果?

我是单元测试中模拟事物的新手,我已经开始尝试使用 Mockito。使用 Mockito 可以进行以下操作吗?


我正在尝试为分层 Web 服务应用程序编写单元测试。此时我正在测试Service层,它调用DAO层从数据库中获取数据。我需要模拟数据库结果,这样我就不会在每次运行单元测试时都对数据库进行真正的更新调用。


我正在考虑通过模拟我的服务层调用的 DAO 对象来做到这一点,但我需要在不更改源代码的情况下做到这一点。如果我目前正在对服务层进行单元测试,我怎样才能让它使用模拟的 DAO 层?


我的单元测试看起来像这样:


@Test

public void testUpdate() {

RequestObject request = new RequestObject();

request.setEntityId(1234);

request.setLob('testLOB');

ResponseObject response = service.updateMember(request);

}

我的服务方式:


public ResponseObject updateMember(RequestObject request) {

ResponseObject result = DAO.updateMember(request);

}

在这种情况下是否可以在不模拟服务的情况下模拟 DAO?编辑:我正在使用 Maven 进行依赖管理。


噜噜哒
浏览 169回答 3
3回答

慕娘9325324

您需要在测试设置中使用像 Mokito 这样的 Mocker。就像是:public class YouTestClass {    @MockBean    DAO mockedDAO;...@Testpublic void testUpdate() {        Mockito.when(mockedDAO.updateMember(Mockito.isA(RequestObject.class)).thenReturn(new ResponseObject());RequestObject request = new RequestObject();request.setEntityId(1234);request.setLob('testLOB');ResponseObject response = service.updateMember(request);}您需要将.thenReturn(new ResponseObject());ResponseObject 调整为您实际想要接收的测试。此外,您的 DAO 类似乎是一个静态类,因此您可能需要阅读如何尽可能地模拟它。否则你可能想让它成为一个单身人士。

拉丁的传说

例如,如果您在服务层上进行测试,您可以这样做。@Mockprivate DAO dao;@Testpublic void testUpdate() {   RequestObject request = new RequestObject();   request.setEntityId(1234);   request.setLob('testLOB');   ResponseObject result = //the response that you want   when(dao.updateMember(eq(request))).thenReturn(result);   ResponseObject response = service.updateMember(request);   // ASSERTIONS HERE}

慕码人8056858

我所做的基本上是:当我通过服务调用调用 DAO 时,例如 '''when(AccountManagerImpl.saveAccount(testAccount)).thenReturn(mockedAccount)'''。挑战在于当方法返回 void 时,即只是将一些数据转储到表中。这意味着您必须间接确认方法调用。在我的例子中,我使用“verify(mockedAccount, times(1)).saveAccount)”。这只能保证该方法至少被调用一次。当然还有更深的层次。如果您想确认数据已写入实际表,那么您自然需要更强大的测试工具,即设置测试数据库等。结果由例如 when(mockPreparedStmnt.execute()) 设置。thenReturn(Boolean.TRUE) 这当然会做出大量假设,这些假设可能会反过来咬你一口。您基本上是在说-让我们假设数据已正确保存。但是,如果该假设本身就是 SUT 怎么办?我只是在代码审查期间提出它——这里是测试覆盖率矩阵将为您节省许多夜晚的地方。
随时随地看视频慕课网APP

相关分类

Java
我要回答