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

2022-09-03 03:06:53

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

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()


答案 1

这是很久以前的问题,但这是我如何使用Mockito spy创建一个在子类中调用父方法的方法:

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");
}

注意:此测试仅检查我们在子类中调用父方法


答案 2

这可以通过应用“组合而不是继承”模式来解决。

public class QuasiChild {

    private final QuasiParent quasiParent;
 
    public QuasiChild(QuasiParent quasiParent) {
        this.quasiParent = quasiParent;
    }
    
    public void someMethod() {
        // do something...

        quasiParent.someMethod();
    }
} 

现在你可以模拟和验证QuasiParent#doSomeMethod()调用。


推荐