【问题标题】:NullPointerException in Mockito when mocking method with primitive argument使用原始参数模拟方法时 Mockito 中的 NullPointerException
【发布时间】:2015-04-22 00:34:34
【问题描述】:

我花了最后一点时间拔头发试图在我的测试中找到问题,最终发现它与模拟一个采用原始参数的方法有关。这是一个演示问题的示例测试:

import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import org.junit.Test;

public class MockitoTest {
    public static interface Foo {
        public Object causeProblems(long arg);
    }

    @Test
    public void testFoo() {
        Foo foo = mock(Foo.class);
        foo.causeProblems(123);
        verify(foo, times(1)).causeProblems(any());
    }
}

运行此测试时(我使用的是 Mockito 1.10 和 Java8),由于某种原因,我的堆栈跟踪在 verify 行上显示了 NPE:

java.lang.NullPointerException
    at com.amazon.jetstream.executor.worker.invoke.MockitoTest.testFoo(MockitoTest.java:19)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
....

我认为我的堆栈跟踪的一部分被抑制了(?)深入研究它,如果我在 Eclipse 中运行它并“检查”该行,我可以从中获得更多信息,这告诉我简单:

java.lang.NullPointerException at longValue()

问题:

  1. 有人知道如何解决这个错误吗?
  2. 如果您可以重现此内容,您能否从堆栈跟踪中获取更多信息?

【问题讨论】:

    标签: java unit-testing mockito


    【解决方案1】:

    你应该匹配长而不是任何对象的匹配器:

    verify(foo, times(1)).causeProblems(anyLong());
    

    我检查了它是否正常运行。

    【讨论】:

    • 如果您需要验证该参数,还有一个longThat(ArgumentMatcher<Long>) 方法 -> longThat(l -> l == 2000)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    相关资源
    最近更新 更多