今天遇到一个powermock的问题:堆栈打印:org.powermock.api.extension.listener.AnnotationEnabler
debug到源代码发现为:
Argument should be a mock, but is:class …
代码如下:
public class MockTest extends BaseTest{
@Spy
@InjectMocks
public A a = new A();
@Test
public void test() {
// 运行此处报错
Assert.assertTrue(a != null);
}
}
class A {
@Autowired
private B b;
}
class B {
}
@RunWith(PowerMockRunner.class)
class BaseTest {
@Spy
@InjectMocks
public B b = new B();
}
后来发现这是PowerMock框架的bug。https://github.com/mockito/mockito/issues/285,看了源代码发现是Spy类注入的依赖对象
此处应责任链模式去处理mock对象。
这里会给每个Spy对象@injectMocks依赖的对象给“注入”进去,这里判断isMock为false导致抛异常.
如果是子类@Spy对象要注入的对象是父类@Spy进去的。那就会使用这个 Marker :
得到对应的mock处理器,一定是要MockAccess。父类是没实现MockAccess。因此返回了null。导致出错。
结论:这个问题是powerMock一个bug,子类需要注入父类的 @Spy对象既会触发此BUG。最好约定,父类都只是mock对象。@spy都在子类即可。
看了此篇文章是不是感觉收获蛮大