使用mockito在抽象超类中设置私有字段

时间:2017-03-29 13:37:05

标签: java junit mockito powermock powermockito

我有一个抽象的超类TP,它有一个具体的子类ETP。这是我的代码:

    abstract class TP {

    private Configuration app;        
         protected MC bMC() {    
         }
    }

和子类ETP代码是:

 public class ETP extends TP {        
    private Configuration app;       
       public MC pT() {
          bMC();
       }
   }

我正在编写ETP的测试用例,这是ETPTest,看起来像这样

public class ETPTest {       
 @Before
    public void setUp() throws Exception {
       // as TP is abstract i am initializing with ETP
          TP = new ETP();        
       // some initialization
   }    
    Whitebox.setInternalState(TP, app);
}

但是app在TP中传递为null并且在TP中获得NPE。

任何想法或建议?

app是TP和ETP中定义的私有变量;我正在尝试为TP中的app设置内部状态。

1 个答案:

答案 0 :(得分:1)

你对这些事情的困难可以被视为一种症状。

您可以决定是否花费数小时才能获得模拟部分,以绕过该问题。

而另一个选项是:理解给定的设计缺乏

  • 子类绝对应该关心超类中的私有字段。 私人的重点是使事情成为一个"实施细节"没有其他班级应该知道或关心
  • 更糟糕的是:通过建立一个具有相同名称的第二个私有字段,您只是加入了这种混乱。那些将是不同的私人领域;没有"覆盖"或"多态性"这里。

最后,您可能不了解如何正确设计使用继承和抽象基类的解决方案。因此,您应该退后一步,例如,如果这样的解决方案有帮助:

public abstract class Base {
  protected abstract Configuration getConfiguration();

  public final void doSomething() {
    ... calls getConfiguration() to do its jobs
  }
}

然后:

public abstract class Subclass extends Base {
  protected Configuration getConfiguration() {
    return whatever

根据经验:干净,直接,非奇怪的设计通常可以通过使用依赖注入和一个模拟在这里进行单元测试,另一个在那里进行模拟测试。一旦你必须研究所有这些复杂的解决方案&#34 ;;比如模拟超类方法/字段;或嘲弄静态方法,...你已经遭受了糟糕的设计;而不是解决这个问题;你试着解决它。

从长远来看,这对你没有帮助。因为真正的问题是" smelly"在您的生产代码中进行设计。