单元测试如何使用 Mockito 模拟存储库

2023-11-25

我在存根我的存储库时遇到问题。有人建议我创建另一个 application.properties (我没有这样做)并使用像 H2 这样的内存数据库。我想知道是否可以对调用进行存根,以便在调用 myDataService.findById(id) 时而不是尝试从数据库中获取仅返回一个模拟对象?

我刚开始为单元测试和 Spring Boot 编写模拟,所以也许我遗漏了一些东西。下面的代码(尝试简化并使名称通用以便在此处发布)。

我的测试班

public class MyServiceImplTest 
{
    private MyDataService myDataService;
    private NyService myService;
    private MyRepository myRepository;

    @Before
    public void setUp() {
        myDataService = Mockito.mock(MyDataServiceImpl.class);
        myService = new MyServiceImpl(myDataService);
    }

    @Test
    public void getById_ValidId() {
        doReturn(MyMockData.getMyObject()).when(myDataService).findById("1");
        when(myService.getById("1")).thenReturn(MyMockData.getMyObject());
        MyObject myObject = myService.getById("1");

        //Whatever asserts need to be done on the object myObject 
    }
}

用于对数据层进行服务调用的类

@Service
public class MyServiceImpl implements MyService {
    MyDataService myDataService;

    @Autowired
    public MyServiceImpl(MyDataService myDataService) {
        this.myDataService = myDataService;
    }

    @Override
    public MyObject getById(String id) {
        if(id == null || id == "") {
            throw new InvalidRequestException("Invalid Identifier");
        }

        MyObject myObj;
        try {
            myObj = myDataService.findById(id);
        }catch(Exception ex) {
            throw new SystemException("Internal Server Error");
        }

        return myObj;
    }
}

这就是我在测试中遇到问题的地方。当调用 findById() 方法时,变量存储库为 null,因此当尝试执行repository.findOne(id) 时,它会抛出异常。这就是我试图模拟的内容,但存储库给了我问题。

@Repository
@Qualifier("MyRepo")
public class MyDataServiceImpl {

    @PersistenceContext
    private EntityManager em;

    private MyRepository repository;

    @Autowired
    public MyDataServiceImpl(MyRepository repository) {
        super(repository);
        this.repository = repository;
    }

    public MyObject findById(String id) {
        P persitentObject = repository.findOne(id);
        //Calls to map what persitentObject holds to MyObject and returns a MyObject 
    }
}

这里的 MyRepository 代码只是为了显示它是一个扩展 CrudRepository 的空接口

public interface MyRepository extends CrudRepository<MyObjectPO, String>, JpaSpecificationExecutor<MyObjectPO> {

}

首先我要说的是,使用构造函数注入而不是字段注入(这使得使用模拟编写测试变得更加简单),您走在正确的轨道上。

public class MyServiceImplTest 
{
    private MyDataService myDataService;
    private NyService myService;

    @Mock
    private MyRepository myRepository;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this); // this is needed for inititalizytion of mocks, if you use @Mock 
        myDataService = new MyDataServiceImpl(myRepository);
        myService = new MyServiceImpl(myDataService);
    }

    @Test
    public void getById_ValidId() {

        doReturn(someMockData).when(myRepository).findOne("1");
        MyObject myObject = myService.getById("1");

        //Whatever asserts need to be done on the object myObject 
    }
}

调用一直从您的服务 --> dataService 开始。但只有您的存储库调用被模拟。
通过这种方式,您可以控制和测试类的所有其他部分(服务和数据服务)并仅模拟存储库调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单元测试如何使用 Mockito 模拟存储库 的相关文章

  • 将链接对象转换为流或集合

    我想迭代堆栈跟踪 堆栈跟踪由可抛出对象组成 其 getCause 返回下一个可抛出对象 最后一次调用 getCause 返回 null 示例 a gt b gt null 我尝试使用 Stream iterable 这会导致 NullPoi
  • Java 创建浮雕(红/蓝图像)

    我正在编写一个 Java 游戏引擎 http victoryengine org http victoryengine org 并且我一直在尝试生成具有深度的 3D 图像 您可以使用那些红色 蓝色眼镜看到 我正在使用 Java2D 进行图形
  • XCode:代码覆盖率数据生成失败

    当我尝试运行单元测试时 我在 Objective C 项目中遇到了这个可怕的问题 我已经尝试了以下所有方法 根据各种 SOF 帖子 清除派生数据 删除 Library 中的所有模拟器设置 重新启动 XCode 重新启动MBP 多次重置模拟器
  • 使用 Checkstyle Plugin 时从插件调用代码时出现问题:“org.eclipse.jface”

    我正在尝试在 Rational Software Architect 7 0 0 4 上使用 eclipse cs 插件 我最近卸载了旧的 beta2 版本并安装了 beta3 插件本身按照之前的配置工作 但是每当我尝试通过 Windows
  • JTree 节点不会被直观地选择

    不知何故 我无法为我的 JTree 节点启用 选择突出显示 我正在我的项目中使用自定义单元格渲染器 这很可能导致此问题 这是完整的渲染器类代码 protected class ProfessionTreeCellRenderer exten
  • 有没有好的方法来解析用户代理字符串?

    我有一个Java接收模块User Agent来自最终用户浏览器的字符串的行为需要略有不同 具体取决于浏览器类型 浏览器版本甚至操作系统 例如 FireFox 7 0 Win7 Safari 3 2 iOS9 我明白了User Agent由于
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • Google Inbox 类似 RecyclerView 项目打开动画

    目前 我正在尝试实现 Google Inbox 例如RecyclerView行为 我对电子邮件打开动画很好奇 我的问题是 该怎么做 我的意思是 他们使用了哪种方法 他们用过吗ItemAnimator dispatchChangeStarti
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • cucumber-junit-platform-engine 中的功能文件发现

    In cucumber junit我使用的库 CucumberOptions定义功能文件位置 package com mycompany cucumber import cucumber api CucumberOptions import
  • 使用 Guava 联合两个 ImmutableEnumSets

    我想联合两个ImmutableEnumSets来自番石榴 这是我的尝试 public final class OurColors public enum Colors RED GREEN BLUE YELLOW PINK BLACK pub
  • 从 Java 日历迁移到 Joda 日期时间

    以前 当我第一次设计股票应用相关软件时 我决定使用java util Date表示股票的日期 时间信息 后来我体会到了大部分方法java util Date已弃用 因此 很快 我重构了所有代码以利用java util Calendar 然而
  • Apache Commons CLI:替代已弃用的 OptionBuilder?

    IntelliJ 显示此示例代码中不推荐使用 OptionBuilderhttp commons apache org proper commons cli usage html http commons apache org proper
  • 如何使用 Mockito 和 Junit 模拟 ZonedDateTime

    我需要模拟一个ZonedDateTime ofInstant 方法 我知道SO中有很多建议 但对于我的具体问题 到目前为止我还没有找到任何简单的解决办法 这是我的代码 public ZonedDateTime myMethodToTest
  • OpenJDK 版本控制

    上下文 我想确保我们系统上安装的 Java 不受 CVE 2022 21449 的影响 java version 给出 openjdk version 11 0 7 2020 04 14 LTS OpenJDK Runtime Enviro
  • 将 RSA 密钥从 BigIntegers 转换为SubjectPublicKeyInfo 形式

    WARNING 最初的问题是关于 PKCS 1 编码密钥 而问题中的实际示例需要SubjectPublicKeyInfo X 509 编码密钥 我目前正致力于在 java 中从头开始实现 RSA 算法 特别是密钥生成方面 现在我的代码可以给
  • 从java中的字符串数组中删除空值

    java中如何从字符串数组中删除空值 String firstArray test1 test2 test4 我需要像这样没有 null 空 值的 firstArray String firstArray test1 test2 test4
  • 如何移动图像(动画)?

    我正在尝试在 x 轴上移动船 还没有键盘 我如何将运动 动画与boat png而不是任何其他图像 public class Mama extends Applet implements Runnable int width height i
  • struts 教程或示例

    我正在尝试在 Struts 中制作一个登录页面 这个想法是验证用户是否存在等 然后如果有错误 则返回到登录页面 错误显示为红色 典型的登录或任何表单页面验证 我想知道是否有人知道 Struts 中的错误管理教程 我正在专门寻找有关的教程 或

随机推荐

  • 流星 SSL 连接

    我正在尝试通过 SSL TLS 连接到我的 Meteor 项目 因此我做了以下事情 流星添加力量 ssl 在流星文件夹中 然后我用 meteor 启动程序 一切都在本地主机上运行良好 但如果我想通过 http 提供 IP 和端口来连接到服务
  • PDO PHP 获取类

    我正在学习 php 中的 pdo 以便使数据库访问更容易 更高效 我读到的 fetch class 的一个解释是 对象的属性是在调用构造函数之前设置的 这是什么意思 任何方向都将受到高度赞赏 这意味着当使用PDO将结果返回到自定义对象时 需
  • 程序是否以兼容模式运行

    是否有一个我可以调用的 C NET 函数来检测我的程序是否在兼容模式下运行 如果没有 有人可以告诉我一个代码吗 谢谢 例如 程序加载完毕 兼容模式检查 如果为真则退出 否则运行 来自另一个论坛 经过几次谷歌搜索后 徒劳无功 我决定自己尝试一
  • ValueError:期望 x 为非空数组或数据集(Collab 上的 Tensor Flow lite 模型制作者)

    我正在关注this有关在 Collab 上使用 TensorFlow lite Model Maker 创建自定义模型的教程 import pathlib path pathlib Path content employee pics co
  • NetBeans (Java Swing):设置窗口大小

    这真让我抓狂 当我在设计模式下为窗口设置适当的大小时 它只会忽略该大小并在编译和运行时使用其他大小 即使很难 我设置了minimumSize和preferredSize 它只是忽略了这一点 为什么 如何设置自己的尺寸 即使你已经设置了尺寸m
  • 如何将事件绑定到按住的鼠标左键?

    我需要只要按住鼠标左键就执行命令 如果您希望在没有任何干预事件的情况下 发生某些事情 即 无需用户移动鼠标或按任何其他按钮 您唯一的选择就是轮询 按下按钮时设置标志 释放按钮时取消设置 轮询时 检查标志并运行您的代码 如果已设置 这里有一些
  • 适用于大量表的实体框架 4.1 (715)

    我正在为包含 700 多个表的数据库开发数据访问层 我创建了包含所有表格的模型 这生成了一个巨大的模型 然后我将模型更改为使用 4 1 中的 DBContext 这似乎改进了它的编译和工作方式 看来设计师根本就没有工作 然后我创建了一个测试
  • 错误:java:Intellij 中的源版本无效:8。这是什么意思?

    我尝试在使用 Intellij Ultimate 13 1 4 中编译一些代码 但出现以下错误 我不知道这意味着什么 Information Using javac 1 7 0 55 to compile java sources Info
  • ImageView 不会填充父级

    我的一个屏幕上有一个 ScrollView 我希望右边缘有阴影 我决定最简单的方法是使 ScrollView 的子视图成为relativelayout 并有两个relativelayout 的子视图 一个是 LinearLayout 用于容
  • Bash if 语句中的正则表达式匹配

    我在这里做错了什么 尝试匹配任何包含空格 小写字母 大写字母或数字的字符串 特殊字符也很好 但我认为这需要转义某些字符 TEST THIS is a TEST title with some numbers 12345 and specia
  • Tomcat 控制台日志到文件

    我在用着阿帕奇汤姆猫7 当我使用安全管理器运行 Tomcat Djava security debug范围我在控制台中收到了很多文本 我无法阅读控制台中的文本 所以我需要控制台登录到某个文件 我怎样才能实现这个目标 Remove Conso
  • 替换 R 数据框中因子列的内容

    我需要替换数据框中因子列的级别 使用iris以数据集为例 我将如何替换包含的任何单元格virginica with setosa in the Species column 我预计以下内容可以工作 但它会生成一条警告消息并简单地插入 NA
  • Python 函数中的默认值[重复]

    这个问题在这里已经有答案了 我注意到以下几点 class c def init self data self data data a c b c a data append 1 print b data 1 这是正确的行为吗 是的 这是正确
  • 如何循环播放媒体播放器文件?

    基本上我有 3 首歌曲 我希望用户能够在 3 首歌曲的循环完成后循环回到第一首歌曲 为什么这不起作用 它将播放所有 3 首歌曲 然后在第四次单击时 不会播放任何歌曲 MediaPlayer song0 song1 song2 Button
  • 访问公共 Facebook 页面时,Graph API 返回“false”或“不支持的获取请求”

    我在使用一些粉丝页面并使用 Facebook Graph API 获取其详细信息时遇到了一些问题 当我尝试获取粉丝页面的详细信息时 Graph API 仅返回false 但现在正在返回 error message Unsupported g
  • 平滑滚动在 ViewPager 中不起作用(支持库)

    我正在编写使用的应用程序ViewPager举办Fragments 当我以编程方式更改片段时 平滑滚动功能不起作用 我使用 ViewPager setCurrentItem int item boolean smoothScroll 方法 也
  • 拆箱不会创建该值的副本。这是正确的吗?

    我正在阅读微软的课堂培训材料 我读了以下内容 拆箱 拆箱与装箱相反 它是引用类型到引用类型的显式转换 值类型 拆箱检索对对象中包含的值类型的引用 拆箱操作涉及检查对象实例以确保该对象 实例是给定值类型的装箱值 那么 实例的值是 复制到值类型
  • 将项目添加到故事板中的滚动视图(尺寸检查器似乎已锁定)

    我使用情节提要在视图控制器中添加了一个内容大小大于屏幕大小的滚动视图 当然 滚动视图的目的是让内容大于包含它的视图 我想在故事板中以图形方式将按钮和标签添加到滚动视图的底部 但我无法查看滚动视图的该部分 我如何到达那里 我尝试调整尺寸检查器
  • 从函数执行存储过程

    我知道这已经被要求死了 我也知道为什么 SQL Server 不让你这样做 但是 除了使用扩展存储过程之外 还有其他解决方法吗 并且请不要告诉我将我的函数转换为过程 所以我真正要问的是 有什么方法可以从函数内运行存储过程吗 EDIT 事实证
  • 单元测试如何使用 Mockito 模拟存储库

    我在存根我的存储库时遇到问题 有人建议我创建另一个 application properties 我没有这样做 并使用像 H2 这样的内存数据库 我想知道是否可以对调用进行存根 以便在调用 myDataService findById id