【问题标题】:Using PowerMockito to mock method with void return-type: "invalid void parameter"使用 PowerMockito 模拟具有 void 返回类型的方法:“无效的 void 参数”
【发布时间】:2014-11-04 14:25:19
【问题描述】:

我在尝试对在某些时候调用本机方法的 java 代码进行单元测试时遇到了一些麻烦。基本上,我正在尝试使用PowerMockito 来模拟最终将调用本机的类。我能够很好地模拟非 void 方法,但是当我尝试模拟 void 返回类型的方法时,我不断收到编译错误。这是我正在尝试测试的代码示例:

public class ClassThatCallsNative {

    void initObject(ByteBuffer param1, int param2) {
        //calls native
    }

    int getId(int param1) {
        //calls native
    }
}

我的测试类中有这段代码:

PowerMockito.when(mClassThatCallsNative.getId(Mockit.anyInt())).thenReturn(0);

这行代码编译得很好,但是下面一行是我得到编译错误的地方:

PowerMockito.when(mClassThatCallsNative.initObject(Mockit.any(ByteBuffer.class), anyInt())).doNothing();

错误消息只是说无效的 void 参数并指向 .initObject。 知道我做错了什么吗?

【问题讨论】:

  • 这与调用原生没有任何关系,你是对的。我只是想为我遇到的问题添加上下文。
  • 问题中的相关任务上下文,标题和标签中的问题上下文。

标签: java unit-testing mockito powermock


【解决方案1】:

由于您试图模拟返回 void 的方法,因此您根本无法在 when() 方法中调用它。这是因为 PowerMockito.when() 方法需要 T methodCall 但得到了 void,这就是编译失败的原因。 相反,您应该使用以下语法:

PowerMockito.doNothing().when(mClassThatCallsNative).initObject(any(ByteBuffer.class), anyInt())

any() 和 anyInt() 方法是 Mockito 类的一部分。

【讨论】:

  • 这里的 mClassThatCallsNative 是什么?如果 initObject 方法是静态的呢?
【解决方案2】:

对于void方法,你需要使用以下一个

PowerMockito.doNothing().when(mClassThatCallsNative.initObject(Mockit.any(ByteBuffer.class), anyInt()))

【讨论】:

  • 同样的错误:这里不允许空类型,对于第一个参数
【解决方案3】:

终于弄清楚了问题所在。原来我需要 ClassThatCallsNative 的实例来模拟它的方法。之前发生的事情是对象在构造函数调用中被初始化,但是当我创建另一个以 ClassThatCallsNative 作为参数的构造函数并将我的实例设置为此时,一切正常。

还是谢谢你!

【讨论】:

  • 另外,模拟 void 方法的代码行是这样的: PowerMockito.doNothing().when(mClassThatCallsNative).initObject(Matchers.any(), Mockito.anyInt());
猜你喜欢
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多