我试图模拟父类中受保护的方法。为此,我使用了Mockito
和PowerMockito
。以下是我的父类。
public class Parent {
protected int foo() {
throw new RuntimeException("Do not invoke this method.");
}
}
我的子类。
public class Child extends Parent {
protected int boo() {
return super.foo();
}
}
测试类。
@RunWith(PowerMockRunner.class)
@PrepareForTest({Parent.class, Child.class})
public class ChildTest {
@Mock
private Child childMock;
@Before
public void before() {
initMocks(childMock);
}
@Test
public void shouldInvokeProtectedMockedMethod() throws Exception {
/* Given */
PowerMockito.doReturn(500).when(childMock, "foo");
/* When */
childMock.boo();
/* Then */
Mockito.verify(childMock, Mockito.times(1)).boo();
Mockito.verify(childMock, Mockito.times(1)).foo();
}
@After
public void after() {
Mockito.reset(childMock);
}
}
当我运行它时,出现了这个错误。
Wanted but not invoked:
child.foo();
-> at com.test.ChildTest.shouldInvokeProtectedMockedMethod(ChildTest.java:36)
However, there were other interactions with this mock:
child.boo();
-> at com.test.ChildTest.shouldInvokeProtectedMockedMethod(ChildTest.java:33)
我做错了什么?
foo
而不是super.foo
会发生什么?我期望的是相同的行为,但当你开始搞字节码时,奇怪的事情可能会发生。 - Dave NewtonChild
进行嘲笑,您的boo
方法是一种模拟实现,它实际上不会调用foo
。我认为您想要的是一个Spy。 - Sotirios Delimanolisboo
上``callTheRealMethod` 就可以了吗? - BretC