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(Object testing, String methodToExecute, Object... arguments)

2 番目、3 番目、4 番目の invokeMethod() で失敗しました。(エラー: 指定されたパラメーターのメソッドが見つかりません)

これは、PowerMock が正しいメソッドを推測しないという問題が原因である可能性があると考えました。したがって、次のように切り替えました。

  1. 親クラスには、正確に複製された isEmpty() メソッドを使用して子クラスでオーバーライドされる isEmpty() メソッドがあります。(レガシーコード) 署名が異なる他の isEmpty() メソッドはありません。パラメータを取るメソッドはたくさんありますが、Object[] を取るメソッドは他にありません (たとえば、Integer[] をパラメータとして取るメソッドはありません)。

  2. 上記の 2 番目の assertTrue ステートメントの前に、arr = new Object[1] に変更すると、その assert ステートメントが渡されます。

どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

4

Javaに対応する引数の配列ではなく、単一の引数として引数をとらせるために、引数をObjectにキャストすることで機能するはずだと思います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 に答える