我在期待来自模拟的setAttribute调用时遇到问题。

MyClass {
  public final void setAttribute(String name, Object value) {
  // Do Something
}

myClass.setAttribute("Key", "Value");


在调用setAttribute操作时,将String作为值传递。
我有一个上述类的模拟物,名称为mockMyClass,在我的Expectations块中,有以下代码。

oneOf(mockMyClass).setAttribute(with(equal("Key")), with(equal("Value")));


我也尝试过使用any,只是为了查看泛型是否有效,但这也给了同样的问题。

我得到的异常:


  java.lang.IllegalArgumentException:并非所有参数都被赋予显式匹配器:要么必须由匹配器指定所有参数,要么必须由值指定所有参数,则不能混合匹配器和值


最初,我尝试不使用任何匹配器,但遇到了异常:

oneOf(mockMyClass).setAttribute("Key", "Value");



  org.jmock.api.ExpectationError:意外调用


如何使它工作?我打算检查实际值。

最佳答案

使方法不是最终的

 public void setAttribute(String name, Object value) {}


和使用

oneOf(mockMyClass).setAttribute("Key", "Value");


或与匹配器any();

jmock开始-ClassImposteriser无法创建最终类的模拟或最终模型的模拟。


  使用jMock和ClassImposteriser模拟类,因为它使用
  Java的标准反射功能,默认配置
  jMock框架只能模拟接口,不能模拟类。 (其实,
  我们认为这是一件好事,因为它鼓励设计
  专注于对象之间的通信,而不是静态的
  分类或数据存储)。但是,ClassImposteriser
  扩展类使用CGLIB 2.1和Objenesis库创建
  模拟类以及接口的对象。这在以下情况下很有用
  与遗留代码一起工作,以紧密地分离依赖关系
  耦合类。
  
  ClassImposteriser创建模拟实例而无需调用
  模拟类的构造函数。所以带有构造函数的类
  可以安全地拥有对象的参数或调用可重写方法
  嘲笑。但是,ClassImposteriser无法创建final的模拟
  类或模拟最终方法。
  
  如果要模拟最终类或最终方法,请使用JDave库
  包含可取消完成的unfinalizer工具代理
  类由JVM加载之前。然后他们可以被嘲笑
  ClassImposteriser。

07-24 15:15