我有三个非常简单的课程。其中一个扩展了父类。
public class Parent{
protected String print() {
// some code
}
}
这是一个儿童班。
public class Child extends Parent {
/**
* Shouldn't invoke protected Parent.print() of parent class.
*/
@Override
protected String print() {
// some additional behavior
return super.print();
}
}
测试课。
public class ChildTest {
@Test
public void should_mock_invocation_of_protected_method_of_parent_class() throws Exception {
// Given
Child child = PowerMockito.mock(Child.class);
Method method = PowerMockito.method(Parent.class, "print");
PowerMockito.when(child, method).withNoArguments().thenReturn("abc");
// When
String retrieved = child.print();
// Than
Mockito.verify(child, times(1)).print(); // verification of child method
Assert.assertEquals(retrieved, "abc");
}
}
我需要验证super.print()
调用。我该怎么办?
答案 0 :(得分:2)
这是很久以前的问题,但这是我如何做到的,使用Mockito间谍,创建一个在子类中调用父方法的方法:
public class Child extends Parent {
/**
* Shouldn't invoke protected Parent.print() of parent class.
*/
@Override
protected String print() {
// some additional behavior
return callParent();
}
protected callParent()
{
super.print();
}
}
在测试中:
@Test
public void sould_mock_invocation_of_protected_method_of_parent_class() throws Exception {
// Given
Child child = Mockito.spy(new Child());
Mockito.doReturn(null)
.when(child)
.callParent();
// When
String retrieved = child.print();
// Then
Mockito.verify(child, times(1)).callParent(); // verification of child method
Assert.assertEquals(retrieved, "abc");
}
注意:此测试仅检查我们在子类中调用父方法
答案 1 :(得分:0)
这可以通过应用“继承之上的组成”模式来解决。
public class QuasiChild {
private final QuasiParent quasiParent;
public QuasiChild(QuasiParent quasiParent) {
this.quasiParent = quasiParent;
}
public void someMethod() {
// do something...
quasiParent.someMethod();
}
}
现在您可以模拟并验证QuasiParent#doSomeMethod()调用。
答案 2 :(得分:-1)
如果您在Child类'super.print()
方法中调用print()
,则会调用print()
的Parent类实现。如何验证它实际发生的取决于父类实现的实际作用。
P.S。您的代码Shouldn't invoke protected Parent.print() of parent class
和Parent.print() method shouldn't be invoked.
中的评论有误。
答案 3 :(得分:-1)
我认为您希望在测试中验证从子类调用父类的print()
实现。
这不需要验证。根据{{3}}调用super.someMethod()
。