Java 模拟注释方法时的NPE

Java 模拟注释方法时的NPE,java,reflection,annotations,mockito,testng,Java,Reflection,Annotations,Mockito,Testng,任务是在调用table.annotationType().getMethod(“name”)时导致NoSuchMethodException异常 我有以下代码 @Mock(answer = RETURNS_DEEP_STUBS) private Table table; @Test(expectedExceptions = NoSuchMethodException.class) public void testGetSupportClassesDatabaseThrowException()

任务是在调用
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);
}
当…行时,
上出现
NullPointerException
时,测试失败

testCompile("org.mockito:mockito-core:2.7.17")
Table
是来自
javax.persistence

问题可能出在模拟
界面中

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

这里有两件事:

  • NPE很奇怪(稍后我会看看是否能找到解释)
  • 即使没有NPE,你的测试也是毫无意义的
您可以看到,您创建了一个表类的模拟实例。配置为对特定调用作出异常反应的

然后调用静态方法,而不以任何方式使用模拟对象。这根本没用

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

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


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

从一个问题开始,这似乎是一个评论,而不是一个答案。mockito版本2.7.17<代码>表是来自javax.persistence的注释
annotationType()
java.lang.annotation
@Turing85中的方法,但不一定是。如果这有帮助的话:有了OP的更多信息,我可以不带问号地重写它。嗯,关于NPE仍然是一个问号…@AStefanovskiy请看我的更新。简言之:我认为你的整个测试都是假的。即使没有NPE,它也不会做你认为它应该做的事情。你有可能分享你完整的依赖关系吗?我想尝试找出导致
NullPointerException
的原因,但我无法正确地缩小依赖项的范围。可能的重复