为什么 Whitebox 不识别我的私有方法?

Why doesn't Whitebox recognize my private method?

我尝试在 public final class 中测试一个名为 MyUtil 的方法:

private static String getStringFromArray(String[] array) {
    String tempString = "";

    if (array != null && array.length > 0) {
      for (int i = 0; i < array.length - 1; i++) {
        tempString += array[i] + ",";
      }
      tempString += array[array.length - 1];
    }

    return tempString;
}

我有两个测试方法,我使用 Whitebox 设置了调用这个私有方法:

@RunWith(PowerMockRunner.class)
@PrepareForTest(MyUtil.class)
public class MyUtilTests {

@Before
public void setUp() {
   PowerMockito.spy(MyUtil.class);
}
  @Test
  public void getStringFromArrayReturnsEmptyStringIfArrayIsNullTest() throws    Exception {
    String[] arrayOfStrings = null;
    String retVal = Whitebox.invokeMethod(MyUtil.class, "getStringFromArray", arrayOfStrings);

    assertEquals("", retVal);
  }

  @Test
  public void getStringFromArrayReturnsElementsSeparatedByCommasTest() throws Exception {
    String[] arrayOfStrings = new String[]{"A", "B", "C"};

    String retVal = Whitebox.invokeMethod(MyUtil.class, "getStringFromArray", arrayOfStrings);

    assertEquals("A,B,C", retVal);
  }
}

当我 运行 这些测试时,我收到一条错误消息:

"org.powermock.reflect.exceptions.MethodNotFoundException: No method found with name 'getStringFromArray' with parameter types: [ java.lang.String, java.lang.String, java.lang.String ]"

为什么 Whitebox 在第一个测试(数组为 null)中识别出该方法,但在第二个测试中(我有一个实际数组)却不能识别该方法?我应该提到我包括了我为这个测试制作的 @Before 间谍 class(我在其他测试中需要它)以防影响问题。

在 Eclipse 编辑器中,我在 Whitebox.invokeMethod 代码行

处看到以下警告

The argument of type String[] should explicitly be cast to Object[] for the invocation of the varargs method invokeMethod(Class, String, Object...) from type Whitebox. It could alternatively be cast to Object for a varargs invocation

因此,当我通过在传递参数时将类型转换为 Object 来更改以下两个测试方法的代码行时,测试用例成功执行。

 String retVal = Whitebox.invokeMethod(MyUtil.class, "getStringFromArray", (Object)arrayOfStrings);