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 が正しいメソッドを推測しないという問題が原因である可能性があると考えました。したがって、次のように切り替えました。
親クラスには、正確に複製された isEmpty() メソッドを使用して子クラスでオーバーライドされる isEmpty() メソッドがあります。(レガシーコード) 署名が異なる他の isEmpty() メソッドはありません。パラメータを取るメソッドはたくさんありますが、Object[] を取るメソッドは他にありません (たとえば、Integer[] をパラメータとして取るメソッドはありません)。
上記の 2 番目の assertTrue ステートメントの前に、arr = new Object[1] に変更すると、その assert ステートメントが渡されます。
どんな助けでも大歓迎です。ありがとう!