【问题标题】:JMock matchers with setAttribute(String, Object)带有 setAttribute(String, Object) 的 JMock 匹配器
【发布时间】:2017-07-03 15:20:47
【问题描述】:

我在期待来自模拟的 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: 意外调用

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

【问题讨论】:

    标签: java junit illegalargumentexception matcher jmock


    【解决方案1】:

    使方法不是最终的

     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 Instrumentation 代理,它可以取消终结 在 JVM 加载类之前。然后他们可以被嘲笑 ClassImposteriser。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 2016-04-08
      • 2019-09-29
      相关资源
      最近更新 更多