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

Java 未找到兼容的方法:将对象传递给方法时出错?,java,unit-testing,jmockit,Java,Unit Testing,Jmockit,我正在尝试为一些旧的遗留代码编写junit 下面是我为其编写junit并使用jmockit的数据记录器类中的方法- private Object[] extractMessageObjects(final Object... objects) { Object[] result = new Object[objects.length - 1]; System.arraycopy(objects, 0, result, 0, result.length); return

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

下面是我为其编写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;
}
所以下面的测试应该可以正常工作。对吧?

@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)
这里有什么不对吗?

在您使用的
invoke(…)
方法中,该方法的参数类型根据
对象[]
中的元素类型进行解析。由于您的包含一个
整数
,jmockit将尝试找到一个接受和
整数
的方法。它将失败,因为这样的方法不存在

No compatible method found: extractMessageObjects(java.lang.Integer)
相反,您可以使用接受参数类型的重载方法

Deencapsulation.invoke(new Example(), "extractMessageObjects",
            new Class<?>[] { Object[].class }, (Object) new Object[] { 1 });
Deencapsulation.invoke(新示例(),“extractMessageObjects”,
新类[]{Object[].Class},(Object)新对象[]{1});

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

谢谢
Sotirios
。它很好用。还有一个愚蠢的问题。我也有类似的方法,比如
private Throwable extractThrowable(final Object…objects){return(Throwable)lastOf(objects);}
也接受objects varg数组。但在这种情况下,我不确定应该传递什么输入参数,因为它返回throwable?有什么想法吗?@AKIWEB与此解决方案类似,只是它需要包含一个对象,您可以将其强制转换为
Throwable
.hmmm。。如果可能的话,你能提供一个例子吗?@AKIWEB在我的回答中,不是调用中的
1
,而是传递一个属于
Throwable
子类型的对象。这是非常依赖于用例的。我真的没有一个例子,当然。在我的例子中,我只需要传递任何东西,这样我就可以覆盖这些代码行。我喜欢这样的调用(logger,“extractThrowable”,新类[]{Object[].Class},UnknownHostException.Class)但它给出了
IllegalArgumentException