我正在尝试为一些旧的遗留代码编写junit
下面是我正在编写junit的DataLogger类中的方法,我正在使用jmockit -
private Object[] extractMessageObjects(final Object... objects) {
Object[] result = new Object[objects.length - 1];
System.arraycopy(objects, 0, result, 0, result.length);
return result;
}
因此,以下测试应该可以正常工作。正确?
@Test
public void testLogDebugWithStackTrace() {
DataLogger logger = DataLogger.getInstance(ClientTest.class);
Object obj[] = new Object[] {1};
Deencapsulation.invoke(logger, "extractMessageObjects", obj);
}
但我得到例外 -
No compatible method found: extractMessageObjects(java.lang.Integer)
我在这里做错了吗?
答案 0 :(得分:5)
在您使用的invoke(..)
方法中,方法的参数类型将根据Object[]
中的元素类型进行解析。由于您的Integer
包含{j},jmockit会尝试查找接受Integer
的方法。它会失败,因为这种方法不存在。
No compatible method found: extractMessageObjects(java.lang.Integer)
相反,您可以使用接受参数类型的重载方法
Deencapsulation.invoke(new Example(), "extractMessageObjects",
new Class<?>[] { Object[].class }, (Object) new Object[] { 1 });
这样它就可以正确地找到合适的方法,而无需使用您所使用的参数类型的提示。请注意,您必须强制转换最后一个参数,以便将其用作Object[]
方法的目标Deencapsulation.invoke(..)
参数中的唯一元素。