5

我正在尝试为我的代码编写单元测试,该代码使用反射来调用我想要为我的测试存根的对象上的隐藏方法:

methodUnderTest(Arg argument) {
  Method toCall = Arg.class.getMethod("toCall");
  Object val = toCall.invoke(argument);
  // Do stuff with val...
}

是否可以创建一个模拟 Arg,我可以将它传递给这个方法,让我对 toCall() 调用进行存根?

Arg 不是我正在创建的对象,因此我无法更改其方法的可访问性。

4

1 回答 1

0

是的,您可以使用反射调用存根方法。但是你不能存根私有方法——mockito 只是没有它的语法。你也不能存根最终方法、静态方法、字段或类。对于这种黑客攻击,您将需要 powermockito。

但你不应该使用它。重构!分成methodUnderTest两种(或三种)方法。最重要的将Object val作为输入并执行您的业务逻辑。您必须测试该方法。

第二种方法将准备要调用的方法和参数(并最终调用它)。目前在这部分您访问静态字段。不。尽可能使用不同的方式(如 Colin 建议的那样)。如果有一些复杂的逻辑,然后测试该逻辑,但你没有测试invoke方法 - 它有效,来自 sun/oracle 的人已经测试过它

于 2013-09-22T13:35:15.590 回答