没有字段的私人二传手 - 单位测试遗产代码

时间:2014-07-17 15:02:37

标签: java unit-testing field private legacy

用于测试MyClass -

我有:

 MyClass{
         private MyThing usedThing = new MyThing(); 

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

问题: 这只是方法的一部分,但我的问题是没有setter,或者没有更改prod代码,我怎样才能注入模拟< strong> MyThing 对象进入测试?

谢谢

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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