JMock与setAttribute匹配(String,Object)

时间:2017-07-03 15:20:48

标签: java junit illegalargumentexception matcher jmock

我期待从模拟中调用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:意外调用

如何让这个工作?我打算检查实际值。

1 个答案:

答案 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。