Gre*_*reg 5 java reflection unit-testing mockito
我正在尝试为我的代码编写单元测试,该代码使用反射对要存根进行测试的对象调用隐藏方法:
methodUnderTest(Arg argument) {
Method toCall = Arg.class.getMethod("toCall");
Object val = toCall.invoke(argument);
// Do stuff with val...
}
Run Code Online (Sandbox Code Playgroud)
是否可以创建一个可传递给此方法的模拟Arg,使我可以对toCall()调用进行存根处理?
Arg不是我要创建的对象,因此无法更改其方法的可访问性。
是的,您可以存根通过反射调用的方法。但你不能对私有方法进行存根——mockito 只是没有它的语法。你也不能存根最终方法、静态方法、字段或类。对于此类黑客攻击,您将需要 powermockito。
但你不应该使用它。重构!分为methodUnderTest两种(或三种)方法。最重要的一个将Object val作为输入并执行您的业务逻辑。你必须测试该方法。
第二个方法将准备要调用的方法和参数(并最终调用它)。目前在这部分中您访问静态字段。不。尽可能使用不同的方式(正如科林的建议)。如果有一些复杂的逻辑,那么测试该逻辑,但你没有测试invoke方法 - 它有效,来自 sun/oracle 的人已经测试过它