我期待从模拟中调用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:意外调用
如何让这个工作?我打算检查实际值。
答案 0 :(得分:1)
make method not final
public void setAttribute(String name, Object value) {}
并使用
oneOf(mockMyClass).setAttribute("Key", "Value");
或与matcher any();
来自jmock的- ClassImposteriser无法创建最终类的模拟或模拟最终方法。
使用jMock和ClassImposteriser模拟类因为它使用 Java的标准反射功能,默认配置 jMock框架只能模拟接口,而不能模拟类。 (其实, 我们认为这是一件好事,因为它鼓励设计 专注于对象之间的通信而不是静态 分类或数据存储)。但是,ClassImposteriser 扩展类使用CGLIB 2.1和Objenesis库来创建 类的模拟对象以及接口。这很有用 使用遗留代码来分开紧密的依赖关系 耦合课程。
ClassImposteriser在不调用的情况下创建模拟实例 模拟类的构造函数。所以带有构造函数的类 有参数或调用对象的可覆盖方法可以安全 嘲笑。但是,ClassImposteriser无法创建最终的模拟 类或模拟最终方法。
如果要模拟最终类或最终方法,请使用JDave库 包括一个可以取消终结的终结者仪器代理 JVM加载它们之前的类。然后他们可以被嘲笑 ClassImposteriser。