使用模拟对象时出现NPE(空指针异常):注解方法。

3
任务是在调用 table.annotationType().getMethod("name") 时引发 NoSuchMethodException 异常。
以下是我的代码:
@Mock(answer = RETURNS_DEEP_STUBS)
private Table table;

@Test(expectedExceptions = NoSuchMethodException.class)
public void testGetSupportClassesDatabaseThrowException() throws NoSuchMethodException {
    String testPackageName = "com.usc.dbd.util.supporttable";

    MockitoAnnotations.initMocks(this);

    when(table.annotationType().getMethod("name")).thenThrow(NoSuchMethodException.class);

    SupportTables.getSupportClasses(testPackageName);
}

测试在when...行抛出NullPointerException异常。
testCompile("org.mockito:mockito-core:2.7.17")

Tablejavax.persistence的注释。

可能问题出在模拟Table接口上。

我正在寻找如何测试这种情况的解决方案。


你能否分享你的完整依赖项集合吗?我想尝试弄清楚是什么导致了 NullPointerException,但我还没有成功地缩小依赖范围。 - Krishnan Mahadevan
可能是Mockito - 在存根方法时出现NullpointerException的重复问题。 - Pavneet_Singh
1个回答

1

这里有两件事:

  • NPE很奇怪(稍后会看看是否能找到解释)
  • 即使没有NPE,你的测试也毫无意义

你创建了一个Table类的mock实例。你对其进行配置以对某个调用做出反应并引发异常。

然后你调用一个静态方法,而没有以任何方式使用该mock对象。那根本不会做任何事情。

后面的静态调用不知道你mock的表格实例的任何信息。你可能认为你的mock设置将影响任何Table对象的调用。不,它不会!它只影响发生在那个特定对象上的调用。

如果你想控制任何任意的Table实例,在任何地方创建,你需要做更多的事情(例如,你必须查看使用PowerMock或JMockit拦截/控制构造函数调用)。

长话短说:目前编写的测试用例根本不会做你编写它的事情。


从一个问题开始,这似乎是一条评论,而不是一个答案。 - Turing85
Mockito 版本 2.7.17; Table 是来自 javax.persistence 的注解; annotationType() 是来自 java.lang.annotation 的方法。 - Oleksandr Stefanovskyi
@Turing85 不一定。如果OP提供更多信息,我可以重新编写它而不使用问号。嗯,关于NPE仍然有一个问号... - GhostCat
@AStefanovskiy 看看我的更新。简而言之:我认为你的整个测试都是虚假的。即使没有那个 NPE,它也不会做你认为它应该做的事情。 - GhostCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接