PowerMock:如何在 Spy 上抑制 parent 方法?
PowerMock: how to suppress parent methods on a Spy?
如何正确抑制 Spy 上的 parent class 方法?
如果我有 class Parent:
public class Parent {
public void method() {
System.out.println("Parent.method");
}
}
class Child extends Parent {
@Override
public void method() {
super.method();
System.out.println("Child.method");
}
}
我用下面的代码测试:
@RunWith(PowerMockRunner.class)
@PrepareForTest(Parent.class)
public class SuppressParentTest {
@Spy Child child = new Child();
@Test
public void testSuppressSuperclassMethods() {
PowerMockito.suppress(methodsDeclaredIn(Parent.class));
child.method();
}
我从 System.out 得到以下打印输出:
Parent.method
Child.method
而我应该只得到 Child.method
.
的打印输出
有趣的是,如果我从 Child object 的声明中删除 @Spy
注释,那么 Parent.method()
会被正确抑制。
我是不是做错了什么?我是否误解了如何使用 PowerMock?
顺序问题。
在您的测试中,Powermock 首先创建 Child
Spy
,然后您要求他抑制 Parent
的方法。似乎为时已晚,因为 Child
实例已经创建。
如果您先调用 suppress
然后创建 Child
,它会起作用:
@Test
public void testSuppressSuperclassMethods() {
PowerMockito.suppress(MemberMatcher.methodsDeclaredIn(Parent.class));
Child child = spy(Child.class);
child.method();
}
如何正确抑制 Spy 上的 parent class 方法?
如果我有 class Parent:
public class Parent {
public void method() {
System.out.println("Parent.method");
}
}
class Child extends Parent {
@Override
public void method() {
super.method();
System.out.println("Child.method");
}
}
我用下面的代码测试:
@RunWith(PowerMockRunner.class)
@PrepareForTest(Parent.class)
public class SuppressParentTest {
@Spy Child child = new Child();
@Test
public void testSuppressSuperclassMethods() {
PowerMockito.suppress(methodsDeclaredIn(Parent.class));
child.method();
}
我从 System.out 得到以下打印输出:
Parent.method
Child.method
而我应该只得到 Child.method
.
有趣的是,如果我从 Child object 的声明中删除 @Spy
注释,那么 Parent.method()
会被正确抑制。
我是不是做错了什么?我是否误解了如何使用 PowerMock?
顺序问题。
在您的测试中,Powermock 首先创建 Child
Spy
,然后您要求他抑制 Parent
的方法。似乎为时已晚,因为 Child
实例已经创建。
如果您先调用 suppress
然后创建 Child
,它会起作用:
@Test
public void testSuppressSuperclassMethods() {
PowerMockito.suppress(MemberMatcher.methodsDeclaredIn(Parent.class));
Child child = spy(Child.class);
child.method();
}