使用PowerMockito.whenNew()不会被模拟,并调用原始方法

我有一个如下所示的代码:

Class A { public boolean myMethod(someargs) { MyQueryClass query = new MyQueryClass(); Long id = query.getNextId(); // some more code } } Class MyQueryClass { .... public Long getNextId() { //lot of DB code, execute some DB query return id; } } 

现在我正在写一个A.myMethod(someargs)的testing。 我想跳过真正的方法query.getNextId() ,而是返回一个存根值。 基本上,我想嘲笑MyQueryClass

所以在我的testing案例中,我使用了:

 MyQueryClass query = PowerMockito.mock(MyQueryClass.class); PowerMockito.whenNew(MyQueryClass.class).withNoArguments().thenReturn(query); when(query.getNextId()).thenReturn(1000000L); boolean b = A.getInstance().myMethod(args); //asserts 

我在testing类的开头使用了@RunWith(PowerMockRunner.class)@PrepareForTest({MyQueryClass.class})

但是,当我debuggingtesting,它仍然调用MyQueryClass类的真正的方法getNextId()

我在这里错过了什么? 任何人都可以帮助,因为我是新的Mockito和PowerMockito。

您需要将调用构造函数的类放入@PrepareForTest注释中,而不是正在构build的类 – 请参阅模拟构build新对象 。

在你的情况下:

@PrepareForTest(MyQueryClass.class)

@PrepareForTest(A.class)

更一般的:

@PrepareForTest(NewInstanceClass.class)

@PrepareForTest(ClassThatCreatesTheNewInstance.class)