2
private boolean isEmpty(Object[] array) {
    if (array == null || array.length == 0) 
        return true;
    for (int i = 0; i < array.length; i++) {
    if (array[i] != null) 
        return false;
    }           

    return true;
}

@Test
public void testIsEmpty() {
        //where is an instance of the class whose method isEmpty() I want to test.
    try {
        Object[] arr = null;
        assertTrue((Boolean)(Whitebox.invokeMethod(where, "isEmpty", new Class<?>[]{Object[].class},  arr)));

        arr = new Object[0];
        assertTrue((Boolean)(Whitebox.invokeMethod(where, "isEmpty", new Class<?>[]{Object[].class}, arr)));

        arr = new Object[]{null, null};
        assertTrue((Boolean)(Whitebox.invokeMethod(where, "isEmpty", new Class<?>[]{Object[].class}, arr)));

        arr = new Object[]{1, 2};
        assertFalse((Boolean)(Whitebox.invokeMethod(where, "isEmpty", new Class<?>[]{Object[].class}, arr)));
    } catch (Exception e) {
        fail(e.getMessage());
    }       
}

问题:java.lang.AssertionError:参数数量错误

研究: 1.最初,我尝试过:invokeMethod(Objecttested, String methodToExecute, Object... arguments)

第 2 次、第 3 次和第 4 次调用方法 () 失败。(错误:未找到给定参数的方法)

我认为这可能是由于 PowerMock 没有推断出正确的方法的问题;因此,我切换到:invokeMethod(Objecttested, String methodToExecute, Class[] argumentTypes, Object... arguments)

  1. 父类有一个 isEmpty() 方法,该方法在子类中被完全重复的 isEmpty() 方法覆盖。(遗留代码)没有其他不同签名的 isEmpty() 方法。有许多采用参数的方法,但没有其他采用 Object[] 的方法(例如,没有采用 Integer[] 作为参数的方法)。

  2. 在上面的第二个 assertTrue 语句之前,更改为 arr = new Object[1] 会使该断言语句通过。

任何帮助是极大的赞赏。谢谢!

4

1 回答 1

4

认为它应该通过将参数转换为 Object 来工作,以使 Java 将其作为单个参数,而不是对应于的参数数组Object...

Whitebox.invokeMethod(where, "isEmpty", new Class<?>[]{Object[].class}, (Object) arr);

测试用例:

public static void main(String[] args) {
    foo(new Object[] {"1", "2"}); // prints arg = 1\narg=2
    foo((Object) (new Object[] {"1", "2"})); // prints args = [Ljava.lang.Object;@969cccc
}

private static void foo(Object... args) {
    for (Object arg : args) {
        System.out.println("arg = " + arg);
    }
}
于 2012-11-01T21:49:24.203 回答