为什么 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);
我尝试在 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);