【问题标题】:Mock call super method - protected模拟调用超级方法 - 受保护
【发布时间】:2018-10-12 19:48:31
【问题描述】:

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

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

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

怎么做?

【问题讨论】:

    标签: java unit-testing junit mockito protected


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      这是不可能的。

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-01-08
        • 1970-01-01
        • 2011-11-29
        • 2016-03-17
        • 1970-01-01
        • 1970-01-01
        • 2010-09-30
        • 2016-03-09
        相关资源
        最近更新 更多