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

标签 java unit-testing jdbc junit mockito

我是在单元测试中模拟事物的新手,并且我已经开始尝试使用 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 进行依赖管理。

最佳答案

您需要在测试设置中使用像 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 类似乎是一个静态类,因此您可能需要阅读如何模拟它(如果可能的话)。否则你可能想让它成为单例。

关于java - 如何在服务层单元测试中模拟数据库结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57510833/

相关文章:

java - 如何从 TableView 中删除大量选定的行?

java - IBM MQ 在 SSL 握手时抛出 java.lang.UnsupportedOperationException

java:检查 php 输出时出错

java - 如何解决 JSR-303 自定义 validator 中的依赖关系

unit-testing - 如何在 Grails 单元测试中模拟 Java 类?

java - DB2 JDBC 驱动程序(类型 4)在 Execute() 上挂起

java.lang.ClassCastException 错误

objective-c - 如何使用Xcode内置的单元测试框架来测试C函数?

Java - 如何测试 Catch block ?

java - 如何使用 jdbc 和 Postgres 将复合类型数组转换为 java 对象数组?