【问题标题】:No Private Setter for Fields - Unit Testing Legacy Code没有字段的私有设置器 - 单元测试遗留代码
【发布时间】:2014-09-08 12:53:32
【问题描述】:

用于测试 MyClass -

我有:

 MyClass{
         private MyThing usedThing = new MyThing(); 

         public String funcToTest(){
               return usedThing.Fields.something.ToString(); 
         }
 }

问题:这只是方法的一部分,但我的问题是没有设置器,或者没有更改产品代码,我该如何注入模拟MyThing 对象进入测试?

谢谢

【问题讨论】:

    标签: java unit-testing field private legacy


    【解决方案1】:

    您可以为此使用反射。这很糟糕,因为它允许您在拥有类之外使用私有方法或字段,从而破坏了封装。但测试是一个有意义的用例。

    您可以通过以下方式从您的测试类访问您的私有字段:

    MyClass myClass = new MyClass();
    Field field = MyClass.class.getDeclaredField("usedThing");
    field.setAccessible(true); // to allow the access for a private field
    field.set(myClass, myMock);
    

    【讨论】:

      【解决方案2】:

      从技术上讲,这只能通过使用反射来实现,但在这种情况下,这是一个非常糟糕的主意。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-23
        • 1970-01-01
        • 2016-10-25
        • 2010-12-05
        • 1970-01-01
        • 1970-01-01
        • 2010-12-03
        • 1970-01-01
        相关资源
        最近更新 更多