我正在尝试为我的代码编写单元测试,该代码使用反射来调用我想要测试的对象上的隐藏方法:
methodUnderTest(Arg argument) {
Method toCall = Arg.class.getMethod("toCall");
Object val = toCall.invoke(argument);
// Do stuff with val...
}
是否有可能创建一个模拟Arg,我可以传入这个方法,让我存根toCall()调用?
Arg不是我正在创建的对象,因此我无法更改其方法的可访问性。
答案 0 :(得分:0)
是的,你可以使用反射调用存根方法。但你不能存根私有方法 - mockito只是没有它的语法。你也不能存在最终方法,静态方法,字段和类。对于这种黑客行为,你需要powermockito。
但你不应该使用它。重构!将methodUnderTest
拆分为两个(或三个)方法。最重要的一个将获得Object val
作为输入,并将执行您的业务逻辑。你必须测试那种方法。
第二种方法将准备调用方法和参数(并最终调用它)。目前在此部分中,您访问静态字段。别。尽可能使用不同的方式(如科林所建议)。如果有一些复杂的逻辑然后测试那个逻辑,但你没有测试invoke
方法 - 它有效,来自sun / oracle的人已经测试了它