如何将 EasyMock 模拟注入测试类私有字段

2024-01-12

我正在使用 EasyMock 创建模拟,它是测试类中的私有参数(没有设置器)之一。我尝试使用反射 - 但它不能正常工作。

public class TestedClassTest{
    @Test
    public void test(){
      TestedClass instance = new TestedClass();
      MockedClass mocked = EasyMock.createMock(MockedClass.class);
      Data data = new Data();

      //Void setter
      DataType dataType = (myDataType.DataType) EasyMock.anyObject();
      mocked.setDataType(dataType);
      EasyMock.expectLastCall();

      //expect
      EasyMock.expect(mocked.getData()).andReturn(data);
      EasyMock.replay(mocked);

      Field field = instance.getClass().getDeclaredField("mockedClass")
      field.setAccessible(true);
      field.set(instance, mocked);

      //run tested method
      instance.someAction();

      EasyMock.verify(mocked);
   }
}

我收到失败信息:

Unexpected method call MockedClass.setDataType(myData.MyData@104306d75):
MockedClass.getData(): expected: 1, actual: 0
junit.framework.AssertionFailedError: 
Unexpected method call MockedClass.setDataType(myData.MyData@132006d75):
MockedClass.getData(): expected: 1, actual: 0

我确信在测试“instance.someAction()”期间会在“MockedClass”对象上触发此方法

如何解决这个问题?

编辑 - 答案: 修正后翻倍replay.mocked()我发现(如此简单!)应该使用以下方式声明另一个 void 方法EasyMock.expectLastCall()


您的反射代码看起来不错。

我已经很久没有使用EasyMock了,但还没有replay在测试中每个模拟只应该调用一次?你调用它两次。尝试摆脱第一个replay call.

在这种情况下,将包含模拟的字段公开是否有意义?一般来说,协作者应该通过构造函数或设置器来设置,从而根本不需要反射。

编辑 - 根据您的更新 - 错误表明setDataType在模拟中被调用,但模拟并不期望它被调用。也许你的类调用它两次,也许它被乱序调用,或者使用你不期望的参数调用它(尽管我希望在这种情况下错误会有所不同)。

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

如何将 EasyMock 模拟注入测试类私有字段 的相关文章

随机推荐

  • 如何计算音频流中每个数据包的 RTP 时间戳

    我阅读了 RTP 规范 但似乎无法理解 RTP 数据包时间戳 我尝试在我的服务器中以不同的方式实现它 但我无法让玩家正确播放它 我在这里的 错误 行为是 我使用 VLC 播放器播放 RTSP url 到我的服务器 我发现玩家的日志说 缓冲太
  • java中捕获javascript返回值

    通过使用 Java Sripting API 我能够在 Java 中执行 JavaScript 但是 有人可以解释一下如何在Java中捕获JS的返回值吗 在下面的示例中 我可以使用调用 script2 inv invokeFunction
  • Rails 5 和 PostgreSQL 'Interval' 数据类型

    Rails 真的不能正确支持 PostgreSQL 的区间数据类型吗 我不得不使用这个堆栈溢出答案 https stackoverflow com questions 20328028 using interval in postgresq
  • 这个 CopyPDBs 函数(来自 clr.dll)在做什么?

    当使用 Process Explorer 在运行 IIS 的生产环境中分析 ASP NET MVC 应用程序时 我注意到有很多对此的调用CopyPDBs函数来自C Windows Microsoft NET Framework64 v4 0
  • 如何对 JavaScript 和 CSS 文件进行 gzip 压缩?

    我有一个问题 我必须 gzip 一个原型库 但我完全不知道如何做到这一点 从哪里开始以及它是如何工作的 我找到了一些教程 但没有帮助 所以我有一个包含 JS 文件的文件夹 压缩 js 1 js 2 js 3 js 我在这个文件中调用这些文件
  • scikit-learn 字典学习中的分段错误(核心转储)

    我写了一个字典学习的代码 它对于 100 个图像工作正常 但如果我使用 200 个图像来学习字典 我会收到 Segment failure 错误 这是我的代码 gt from time import time import matplotl
  • 存储库模式 - 如何正确处理 JOIN 和复杂查询?

    我对存储库模式有疑问 如何在多个存储库之间执行 JOIN 操作 在这个项目中 我们使用了MVC EF DDD 我知道这种问题已经出现过好几次了 我稍后会在本问题中引用这些问题 在通用存储库模型 IRepository 和特定存储库模型之间
  • Python:类型错误:“NoneType”对象不可下标

    Uses python3 import sys def max dot product a b n a a sort reverse True b b sort reverse True res 0 for i in range n res
  • 在 Python 2 中按定义顺序迭代枚举

    我正在使用 python 3 4 和 python 2 7 的反向移植 Enum 功能 gt python version Python 2 7 6 gt pip install enum34 Installs version 1 0 根据
  • Swift:尝试导入 UIKit 时出错

    当我尝试在我的 swift 文件中导入 UIKit 时 我遇到了这个非常奇怪的错误 我的代码很简单 import UIKit class Test NSObject 我在 导入 UIKit 时收到的错误是 未知类型名称 导入 预期的 在顶级
  • 是否可以从 iPhone safari 浏览器获取 UDID?

    我需要从 iPhone safari 浏览器检索 UDID 或任何其他设备唯一 ID 通过 cookie 或请求 响应标头或任何其他方式 如果可以的话可以怎样做 谢谢 Z 您可以使用 mobileconfig 看http whatsmyud
  • WCF 数据服务或 RIA 服务可以用 NHibernate 实现吗?

    从何而来我在网上读到 http wildermuth com 2009 09 29 Choosing a Data Access Layer for Silverlight 3 WCF 数据服务似乎通过服务器上的实体框架绑定到数据访问 有没
  • 从 Android 活动转到主屏幕

    我正在 android 中制作一个应用程序 我想实现一个按钮 以便每当按下它时 我只需返回主屏幕 我知道我们有硬件键和软键 当没有硬件键时 可以实现此功能 但我想为此应用程序添加此功能 有人知道该怎么做吗 谢谢 Try this Inten
  • Android 方向变化

    我有一个简单的Activity called SingleTouchTest理解屏幕触摸 奇怪的是SingleTouchTest从我所处的任何方向开始 但旋转设备不会导致屏幕旋转 我的测试设备是运行 Android 4 0 3 的 Acer
  • 如何以编程方式合并具有潜在冲突的文本文件(ala git 或 svn 等)?

    作为较大项目的一部分 我希望能够获取两个文本主体并将它们交给合并算法 该算法返回自动合并结果 在更改不冲突的情况下 或抛出错误并且 可能 生成一个文本文档 其中突出显示冲突的更改 基本上 我只是想要一种编程方式来完成地球上每个源代码控制系统
  • 如何仅在精确的 url 匹配时重定向?

    我正在尝试使用 apache htaccess 进行重定向 我有以下代码 redirectMatch 301 user http clients mydomain com 它工作得很好 但我不想要 用户登录 被引导至 http client
  • JSF 中 的范围是什么?

    我曾两次看到先前浏览的页面中的变量可能会干扰或替换下游查看的页面中的变量 例如 h datatable var 那么 ui param 的范围是什么 有没有办法遏制它 它基本上在 EL 上下文中设置一个新的变量映射 也可以看看的源代码Par
  • mysql 和 mysql2 gem 有什么区别

    我曾经与mysql宝石 但现在我经常听说mysql2宝石 此外 它还包含在Gemfile默认情况下Rails 3 0 x 使用有什么区别和优点mysql2 gem 这是来自mysql2 宝石页面 https github com brian
  • 当到达 gdb 中的断点时是否可以停止所有其他线程的执行?

    那么 一旦我在某个线程中遇到断点 是否可以暂停其他线程直到我继续 在全停止模式下 当前发布版本支持的唯一模式 只要任何线程停止 由于断点或信号 GDB 就会停止所有线程 当您继续停止的线程时 所有其他线程也将继续 除非您这样做set sch
  • 如何将 EasyMock 模拟注入测试类私有字段

    我正在使用 EasyMock 创建模拟 它是测试类中的私有参数 没有设置器 之一 我尝试使用反射 但它不能正常工作 public class TestedClassTest Test public void test TestedClass