如何验证父类的super.method()的调用?

时间:2014-07-22 19:53:50

标签: java unit-testing mockito powermock

我有三个非常简单的课程。其中一个扩展了父类。

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()调用。我该怎么办?

4 个答案:

答案 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 classParent.print() method shouldn't be invoked.中的评论有误。

答案 3 :(得分:-1)

我认为您希望在测试中验证从子类调用父类的print()实现。

这不需要验证。根据{{​​3}}调用super.someMethod()