找不到兼容的方法:将对象传递给方法时出错?

AKI*_*WEB 3 java unit-testing jmockit

我正在尝试为我们拥有的一些旧遗留代码编写junit

下面是DataLogger类中的方法,我正在编写junit并且我正在使用jmockit -

private Object[] extractMessageObjects(final Object... objects) {
    Object[] result = new Object[objects.length - 1];

    System.arraycopy(objects, 0, result, 0, result.length);

    return result;
}
Run Code Online (Sandbox Code Playgroud)

所以下面的测试应该可行.对?

@Test
public void testLogDebugWithStackTrace() {
    DataLogger logger = DataLogger.getInstance(ClientTest.class);

    Object obj[] = new Object[] {1};
    Deencapsulation.invoke(logger, "extractMessageObjects", obj);
}
Run Code Online (Sandbox Code Playgroud)

但我得到例外 -

No compatible method found: extractMessageObjects(java.lang.Integer)
Run Code Online (Sandbox Code Playgroud)

我在这里做错了吗?

Sot*_*lis 5

invoke(..)您使用的方法中,方法的参数类型将根据您的元素类型进行解析Object[].由于你的包含一个Integer,jmockit将尝试找到一个接受和的方法Integer.它会失败,因为这种方法不存在.

No compatible method found: extractMessageObjects(java.lang.Integer)
Run Code Online (Sandbox Code Playgroud)

相反,您可以使用接受参数类型的重载方法

Deencapsulation.invoke(new Example(), "extractMessageObjects",
            new Class<?>[] { Object[].class }, (Object) new Object[] { 1 });
Run Code Online (Sandbox Code Playgroud)

这样它就可以正确地找到合适的方法,而不需要使用您使用的参数类型的提示.请注意,您必须转换最后一个参数,以便将其用作方法的target Object[]参数中的唯一元素Deencapsulation.invoke(..).