首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PowerMock:使用Whitebox.invokeMethod(…)适当地适用于以Object[]作为param的方法

PowerMock:使用Whitebox.invokeMethod(…)适当地适用于以Object[]作为param的方法
EN

Stack Overflow用户
提问于 2012-11-01 21:30:50
回答 1查看 10.1K关注 0票数 2
代码语言:javascript
复制
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(对象测试,字符串methodToExecute,Object.(论据)

它在第2、第3和第4 invokeMethod()中失败。(错误:在给定参数下找不到的方法)

我认为这可能是因为PowerMock无法推断出正确的方法;因此,我转而使用invokeMethod(对象测试,字符串methodToExecute,Class[] argumentTypes,Object.(论据)

  1. 父类有一个isEmpty()方法,该方法在子类中被完全复制的isEmpty()方法覆盖。(遗留代码)没有其他不同签名的isEmpty()方法。有许多方法接受参数,但没有其他方法接受对象e.g. no methods that take an Integer[] as a parameter
  2. 在上面的第二个assertTrue语句之前,更改为arr =newObject1将使assert语句传递。

任何帮助都是非常感谢的。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-01 21:49:24

我认为它应该通过将参数转换为Object来工作,以便使Java将其视为单个参数,而不是与Object...对应的一系列参数。

代码语言:javascript
复制
Whitebox.invokeMethod(where, "isEmpty", new Class<?>[]{Object[].class}, (Object) arr);

测试用例:

代码语言:javascript
复制
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);
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13185784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档