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

时间:2018-05-02 16:11:20

标签: java unit-testing junit mockito protected

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

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

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

怎么做?

2 个答案:

答案 0 :(得分:0)

这是不可能的。

尝试使用合成而不是继承来使测试工作。

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

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 也可以派上用场。

答案 1 :(得分:0)

为什么你甚至想做这样的事情?

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

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

  • 如果某人以突破方式修改A.doSomething(),您的测试仍会通过,(误报
  • 如果有人只从B.doSomething()提取一行代码到A.doSomething()(这不是那么不可能,因为它们已经面向代码重用),测试很可能会失败(a 误报