模拟调用超级方法 - 受保护

Mock call super method - protected

我的问题是我想用模拟超级调用方法测试 B class,因为我不需要在那里测试 super.doSomething()。

public class A{
    protected void doSomething(){
        //some Code
    }
}

public class B extends A{
    @Override
    protected void doSomething(){
        //some Code
        super.doSomething();
    }
}

怎么做?

这不可能。

尝试使用组合而不是继承使您的测试工作。

我的意思是,如果可能,请执行以下操作:

public class B extends A{

    //notice the composition of class A into class B

    private A a;
    ........

    @Override
    protected void doSomething(){
        //some Code
        a.doSomething();
    }
    ......
}

在这里,您可以轻松地在测试中模拟 a

如果这不是选择,那么您将不得不模拟 super.doSomething() 方法中的所有内容。 powermockito 也可能派上用场。

为什么你会想要做这样的事情?

它给你的保证是:B.doSomething() 行为正确,前提是 A.doSomething() 永远不会改变,前提是 A 永远保持B 的超类。

您的目标是密封实施 AB 吗?单元测试的目标通常是相反的——鼓励重构。你的情况:

  • 如果有人以破坏性的方式修改 A.doSomething(),您的测试仍然会通过,(误报
  • 如果有人只提取了从 B.doSomething()A.doSomething() 的一行代码(这不太可能,因为他们已经面向代码重用),测试很可能会失败(假阴性