【问题标题】:NPE when mocking Annotation method模拟注释方法时的NPE
【发布时间】:2018-10-12 15:55:11
【问题描述】:

任务是在调用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);
}

测试失败,NullPointerExceptionwhen... 行。

testCompile("org.mockito:mockito-core:2.7.17")

Table 是来自javax.persistence 的注解

问题可能在于模拟Table 接口。

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

【问题讨论】:

标签: java reflection annotations mockito testng


【解决方案1】:

这里有两件事:

  • NPE 很奇怪(我会在稍后找到解释)
  • 即使没有 NPE,您的测试也毫无意义

你看,你创建了 Table 类的 一个 模拟实例。您配置为对特定调用做出反应,但出现异常。

然后调用 static 方法,而不以任何方式使用该模拟对象。那根本不会做任何事情。

稍后,静态调用对您的模拟表实例一无所知。您可能假设您的模拟设置将影响 any Table 对象。不,它不会!它只影响发生在那个 specific 对象上的调用。

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

长话短说:正如现在所写的那样,您的测试用例根本不符合您编写它的目的。

【讨论】:

  • 从一个问题开始,这似乎是一个评论,而不是一个答案。
  • 模拟版本 2.7.17; Table 是来自javax.persistence 的注解; annotationType() 是来自 java.lang.annotation 的方法。
  • @Turing85 不一定。如果这有帮助:有了来自 OP 的更多信息,我可以在没有问号的情况下重写它。好吧,关于 NPE 仍然是一个问号......
  • @AStefanovskiy 查看我的更新。简而言之:我认为你的整个测试都是假的。即使没有那个 NPE,它也不会做你认为它应该做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
相关资源
最近更新 更多