【问题标题】: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】:
从技术上讲,这只能通过使用反射来实现,但在这种情况下,这是一个非常糟糕的主意。