【问题标题】:PowerMock throwing null pointer exception at queue.add methodPowerMock 在 queue.add 方法中抛出空指针异常
【发布时间】:2015-07-15 18:45:18
【问题描述】:

我正在使用 Powermock 对一个类进行单元测试。

该类有一个对象列表队列作为私有成员。 我正在使用 PowerMock createPartialMock 部分模拟其中两个方法(比如 A 和 B),然后显式调用方法 C 然后进行验证。

Class Sample {
    Queue<List> q;

    public C() {  
        A(); 
        B(); 
        q.add(List);
    }

    private A() {}
    private B() {}
}

Class Test {
    void testSomeMethod() {
        Sample mock = PowerMock.createPartialMock(Sample.class, "A", "B");
        PowerMock.expectPrivate(Sample.class, A).thenReturn("true");
        PowerMock.expectPrivate(Sample.class, B).thenReturn("true");

        mock.C();
        PowerMock.verify(mock);
    }
}

现在,当我运行测试时,PowerMock 在q.add(List); 行抛出异常。

谁能指出我犯了什么错误? 我是否也期望 q.add() 方法调用?

【问题讨论】:

  • q 未初始化,因此引发 NPE。您可以通过以下方式注入内部状态:Whitebox.setInternalState(mock, "q", new LinkedList&lt;List&gt;()); 此外,q.add(List); 似乎不是有效的 Java,因为List 不是有效的实例。除此之外,PowerMock 有一个关于如何mock constructors
  • @RomanVottner 为什么不这样做Whitebox.setInternalState(mock, "q", new PriorityQueue&lt;&gt;()); 它会添加任何属于“java.util.List”子类型的列表
  • @Vihar 我只是举了一个简单的例子,说明如何将对象注入到类的字段中以进行测试,只要要注入的对象是 Queue&lt;List&gt; 的实现。 LinkedList 只是您可以分配的许多事情之一。如果你更喜欢PriorityQueue&lt;&gt;,那就用它来代替链表

标签: java unit-testing powermock easymock


【解决方案1】:

您应该以某种方式为 Sample 类的 q 属性赋值。 这可以通过构造函数、setter 方法或反射(Whitebox 类或纯 Java 反射代码)来完成。

如果你需要检查一个item是否被添加到q中,创建一个Queue接口的mock。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多