为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

噜噜哒 2023-06-08 13:50:44
我是单元测试中模拟事物的新手,我已经开始尝试使用 Mockito。使用 Mockito 可以进行以下操作吗?我正在尝试为分层 Web 服务应用程序编写单元测试。此时我正在测试Service层,它调用DAO层从数据库中获取数据。我需要模拟数据库结果,这样我就不会在每次运行单元测试时都对数据库进行真正的更新调用。我正在考虑通过模拟我的服务层调用的 DAO 对象来做到这一点,但我需要在不更改源代码的情况下做到这一点。如果我目前正在对服务层进行单元测试,我怎样才能让它使用模拟的 DAO 层?我的单元测试看起来像这样:@Testpublic 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 进行依赖管理。
查看完整描述

3 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

您需要在测试设置中使用像 Mokito 这样的 Mocker。就像是:


public class YouTestClass {


    @MockBean

    DAO mockedDAO;

...

@Test

public 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 类似乎是一个静态类,因此您可能需要阅读如何尽可能地模拟它。否则你可能想让它成为一个单身人士。


查看完整回答
反对 回复 2023-06-08
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

例如,如果您在服务层上进行测试,您可以这样做。


@Mock

private DAO dao;


@Test

public 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

}


查看完整回答
反对 回复 2023-06-08
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

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



查看完整回答
反对 回复 2023-06-08
  • 3 回答
  • 0 关注
  • 168 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信