【问题标题】:No compatible method found: error while passing object to a method?找不到兼容的方法:将对象传递给方法时出错?
【发布时间】:2014-04-19 15:20:10
【问题描述】:

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

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

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)

我在这里做错什么了吗?

【问题讨论】:

    标签: java unit-testing jmockit


    【解决方案1】:

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

    No compatible method found: extractMessageObjects(java.lang.Integer)
    

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

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

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

    【讨论】:

    • 谢谢Sotirios。它工作正常。还有一个愚蠢的问题。我也有类似 private Throwable extractThrowable(final Object... objects) { return (Throwable) lastOf(objects); } 这样的类似方法,它也接受对象 varg 数组。但在这我不确定我应该传递什么输入参数,因为它返回可抛出?有什么想法吗?
    • @AKIWEB 类似于这个解决方案的东西,除了它需要包含一个可以转换为Throwable的对象。
    • hmmm.. 如果可能的话,你能提供一个例子吗?
    • @AKIWEB 而不是我回答中调用中的1,而是传递一个作为Throwable 子类型的对象。这非常依赖于用例。我真的没有例子。
    • 当然。就我而言,我只需要传递任何东西,以便我可以覆盖这些代码行。我确实喜欢这个invoke(logger, "extractThrowable", new Class&lt;?&gt;[] { Object[].class }, UnknownHostException.class); 但它给了IllegalArgumentException
    猜你喜欢
    • 2015-06-07
    • 1970-01-01
    • 2023-03-09
    • 2011-09-27
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多