Mockito:如何在 Spy 中模拟对象

2024-03-23

该应用程序运行在JEE环境中。 我希望将 Spy 注入到被测试的 bean 中。 Spy 对象内部还有一些需要注入的 bean。如何将这些 bean 的模拟注入到 Spy 中?

这是用例:

package testinject2;

import javax.inject.Inject;

public class ABean {

    @Inject
    BBean b;
    
    public void print() {
        System.out.println("Hi, I'm ABean");
        b.print();
    }
}
package testinject2;

import javax.inject.Inject;

public class BBean {

    @Inject
    CBean c;
    
    public void print() {
        System.out.println("Hi, I'm BBean");
        c.print();
    }
}
package testinject2;

public class CBean {

    public void print() {
        System.out.println("Hi, I'm CBean");
    }
}
package testinject2;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)

public class ABeanTest {

    @Spy
    CBean c = new CBean();
    
    @Spy
    BBean b = new BBean();
    
    @InjectMocks
    ABean beanUnderTest;
    
    @Test
    public void test() {
        beanUnderTest.print();
    }
}

我期望获得

Hi, I'm ABean
Hi, I'm BBean
Hi, I'm CBean

但相反,我有一个空指针异常,因为 Bean 没有注入到 Bean 中。

将 Spy 对象注入另一个 Spy 的正确方法是什么?


您需要定义应通过哪些对象模拟注入@InjectMocks注释,但它不能与@Spy注解。看模拟问题 https://github.com/mockito/mockito/issues/2459.
有一个最简单的解决方案可以使用Mockito.spy代替@Spy和...一起@InjectMocks:

    @InjectMocks
    BBean b = Mockito.spy(new BBean());

完整测试代码:

@RunWith(MockitoJUnitRunner.class)
public class ConfigTestObject {

    @Spy
    CBean c = new CBean();

    @InjectMocks
    BBean b = Mockito.spy(new BBean());

    @InjectMocks
    ABean beanUnderTest;

    @Test
    public void test() {
        beanUnderTest.print();
    
        //verify that mocks is working
        verify(c, atLeast(1)).print();
        verify(b, atLeast(1)).print();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mockito:如何在 Spy 中模拟对象 的相关文章

随机推荐

  • 有没有一种方法可以在不添加 throws 声明的情况下抛出异常?

    我有以下情况 我有一个 Java 类 它继承自另一个基类并重写一个方法 基本方法不会抛出异常 因此没有throws 宣言 现在我自己的方法应该能够抛出异常 但我可以选择 吞掉异常或 添加抛出声明 两者都不令人满意 因为第一个会默默地忽略异常
  • Microsoft Edge,媒体查询无法正常工作

    我在 Google Chrome 上成功测试了此媒体查询 但不知何故 Microsoft Edge 存在问题 这些查询有问题吗 或者这只是 Microsoft Edge 中的一个错误 UPDATE 看起来 Edge 需要一个没有媒体查询的类
  • 查找背包中的物品

    我想用C 递归地解决背包问题 这是我的代码 public int f int n int remain if n lt 0 return 0 if w n gt remain Thread VolatileWrite ref check n
  • as3crypto 的 sha1 哈希值与 PHP 生成的哈希值不同

    使用 as3 中的 as3crypto 从字符串 12345 生成 SHA1 哈希 与示例中的操作方式相同 var sha1 SHA1 new SHA1 var src ByteArray Hex toArray 12345 var dig
  • SCons 库和子库

    我有一个基于 SCons 的分层构建系统 我有一个根 SConstruct 它调用一个构建共享库的 SConscript 然后调用另一个构建依赖于共享库的可执行文件的 SConscript 所以这是我的问题 我对linux上共享库的理解是
  • 与目标虚拟机断开连接,地址:“127.0.0.1:62535”,传输:intellij idea CE 上的“socket”。我无法调试我的程序。有什么建议么?

    连接到目标VM 地址 127 0 0 1 63073 传输 socket 与目标虚拟机断开连接 地址 127 0 0 1 63073 传输 socket 我有同样的问题 我注意到应用程序上没有设置下拉菜单 看一下这个
  • C指针指针和段错误

    下面是我用 C 编写的简单链表 我的问题是在 headRef newNode 中这会导致分段错误 然后我尝试 headRef newNode 这解决了seg错误问题 尽管这两行代码在我看来似乎以相同的方式工作 但为什么一行代码会导致段错误
  • Android 以编程方式接听电话

    是否可以以编程方式在android中接听电话 我发现有些地方不可能 但随后安装了应用程序https play google com store apps details id com a0softus autoanswer https pl
  • JqueryUI可排序滚动问题

    我已经初始化了 items作为jquery可排序 使项目列表可排序 items是父 div 的子 div content 父级div content最大高度设置为 40 并且允许在溢出时滚动 这是CSS content parent div
  • Clojure ^floats 与 #^floats?

    有什么区别 floats and floats在 Clojure 类型注释中 在拉取请求中 有人建议我使用此注释 put floats init fft array 这确实有效 但我不知道为什么会有 我发现这也有效 put floats i
  • ScrollView 根本不滚动

    我无法使 ScrollView 正确滚动 它总是切断底部的内容 就好像它是一个普通的 LinearLayout 一样 My code
  • 我会被这个代码攻击吗?

    我购买了一个脚本 其中有一些奇怪的代码 我是一名 PHP 初学者 但对清理输入数据之类的事情略知一二 这是代码
  • 如何判断代码是否将在 Blazor 的客户端或服务器上运行?

    我是 Blazor 开发的新手 我可能在这里遗漏了一些明显的东西 但是搜索 google 阅读文档和搜索此网站并没有为我找到答案 出于安全原因 我需要确保一些代码在服务器端运行 例如散列密码 我知道 Blazor 通常会自动确定代码的运行位
  • Asp.net Viewstate不保存控件的样式

    我读过 asp net 中的视图状态存储以下值控制属性跨回发 假设我有一个带有文本框的页面
  • JQgrid 从列中保存和恢复对象

    可以将复杂的对象保存到列中并在之后恢复它 这是一个例子 杰森 datamain mydata address data1 15 data2 0 0 data3 1000 Jqgrid jQuery rowed5 jqGrid datatyp
  • 如何在检索 ListView 项目时显示“正在加载...”文本

    还有一些其他应用程序可以执行此操作 例如 Twitter Facebook 甚至是 Android Market 等本机应用程序 当您想要显示从互联网检索到的项目列表时 这看起来像是向用户显示有关正在进行的操作的一些通知的标准方法 这是一个
  • Apache 上不带尾部斜杠的虚荣 URL

    下面的代码重写了我们网站上 profiles 目录中的所有 URLexample com profiles name to example com name 但我们还想删除结尾的斜杠 以进一步简化生成的 URL 使其更漂亮example c
  • 1 个 django 应用程序中约有 20 个模型

    我已经开始为自己开发一个通过浏览器运行的本地应用程序 最近读完 django 教程后 我认为使用 django 而不是简单的 python 可能会更好 有一个问题 我至少有 20 个模型 每个模型都有很多功能 很简单 它将创建一个巨大的模型
  • Android 应用程序中带有 KeyStore.getInstance 的 NoSuchAlgorithmException

    我在android中编写程序用于与服务器通信 我使用SSL协议 当我编写这段代码时 KeyStore ks KeyStore getInstance JKS 我收到这个错误 java security NoSuchAlgorithmExce
  • Mockito:如何在 Spy 中模拟对象

    该应用程序运行在JEE环境中 我希望将 Spy 注入到被测试的 bean 中 Spy 对象内部还有一些需要注入的 bean 如何将这些 bean 的模拟注入到 Spy 中 这是用例 package testinject2 import ja