我在期待来自模拟的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。