【问题标题】:JUnit Test cases Using Mockito: null pointer exception使用 Mockito 的 JUnit 测试用例:空指针异常
【发布时间】:2017-06-27 16:46:03
【问题描述】:

我正在使用Mockito 编写JUnit 测试用例。我已经使用反射与 java 的 IIOImage 类的模拟对象填充了一个列表。虽然我的列表有对象,但我的测试用例失败了,我得到了一个空指针异常。任何人都可以帮忙吗?

_sourceList=(List) Whitebox.getInternalState(OneClass, "_sourceListContent");

_sourceList.add(Mockito.mock(IIOImage.class)); 
_sourceList.add(Mockito.mock(IIOImage.class));
Field listfield=OneClass.class.getDeclaredField("_sourceListContent");
listfield.setAccessible(true);
listfield.set(oneclass, _sourceImages);
System.out.println(_sourceList.size()+"is size");

for(int i=0;i<=_sourceImages.size(); i++) //this loop is giving null
{   
      IIOImage img = (IIOImage)_sourceImages.get(i);
      SomeClass data=Mockito.mock(SomeClass.class);
      data=(SomeClass)img.getMetadata();
      data.dumpData();
}

它在这里返回大小,但是当我运行测试用例说空指针时会导致问题。

这是堆栈跟踪

java.lang.NullPointerException
at SomeClass.SomeClassTest.dumpRequestTest(IPRequestTest.java:285)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

【问题讨论】:

  • 请添加堆栈跟踪。
  • 我已经添加了堆栈跟踪

标签: java unit-testing junit mockito junit4


【解决方案1】:

您正在创建实例作为模拟:

_sourceList.add(Mockito.mock(IIOImage.class)); 

稍后您将它们一一退休并在每个上调用此方法:

IIOImage img = (IIOImage)_sourceImages.get(i);
data=(SomeClass)img.getMetadata();

你没有声明当这个方法被调用时 Mockito 应该返回什么(使用 when(..).thenReturn(..) 语法),因此 Mockito 返回一个默认的 null 值。

当你调用时:

data.dumpData();

你会得到一个NullPointerException,因为datanull

修复

  • 通过when(img.getMetadata()).thenReturn(..) 声明应返回的内容。
  • 使用 Mockito.spy 代替 mock。

【讨论】:

  • 感谢您的建议,但 Mockito.spy 对我不起作用并抛出一组新异常。当我调用它时,img.getMetadata() 返回 null。是不是因为这个我遇到了问题?
  • 你必须声明返回值 then..when(img.getMetadata()).thenReturn(/* some instance */)
  • 这行不通。由于 data.dumpData() 返回的 null 值,我的测试用例失败并返回 NullPointerException。
  • data.dumpData(); 里面有什么?我没有看到您将此方法的返回值分配给任何变量。也许发布整个测试,这样我们就不会错过任何东西..
  • public void dumpData() { NodeList childNodes = _root.getChildNodes(); for(int i=0;i
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
  • 2019-05-24
  • 2021-06-15
  • 1970-01-01
  • 2016-08-19
相关资源
最近更新 更多