模拟Annotation方法时的NPE

时间:2018-05-02 13:51:52

标签: java reflection annotations mockito testng

任务是在调用table.annotationType().getMethod("name")时导致@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); } 异常。

我有以下代码

NullPointerException

测试在when...testCompile("org.mockito:mockito-core:2.7.17") 处失败。

Table

javax.persistence是来自Table

的注释

问题可能在于模仿Name, Surname, ID, Job, Salary, DOB adam, Parker, 123, admin, 500, 19.02.1988 joe, Oswald, 897, sales manager, 750, 10.04.1967 界面。

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

1 个答案:

答案 0 :(得分:1)

这里有两件事:

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

您会看到,您创建了Table类的一个模拟实例。您配置为对具有异常的特定呼叫做出反应。

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

稍后,静态调用不知道有关您的模拟表实例的任何。您可能认为模拟设置会影响任何 Table对象。不,它不会!它仅影响在特定对象上发生的调用。

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

长话短说:就像现在所写的那样,你的测试用例根本不会做你为它编写的内容。