在单元测试中使用Reflection是不好的做法吗? [重复]
这个问题在这里已有答案:
如何测试私有函数或具有私有方法,字段或内部类的类?
46个答案
没有找到相关结果
已邀请:
7 个回复
泻伴墓荒
课刊灭似
。但它的目的是设置依赖的模拟,春天应该注入它们。 该主题比“do& do not”更深入,并且考虑应该测试的内容 - 是否需要测试对象的内部状态;我们是否应该负责质疑被测班级的设计;等等
笛驮型迸
仿普
在你的单元测试中
如果你有一个受保护的构造函数:
我不一定会在正常情况下推荐上述内容,但是要求您使用限制而不是“最佳实践”。
净爽
抵舵
犯痪桂涛杭
在这里,我们使用反射来执行私有方法SomeApplicationClass.computeSquare(),传入一个Integer并返回一个String结果。这导致JUnit测试,如果发生以下任何一种情况,它将编译正常但在执行期间失败: 方法名称“computeSquare”已重命名 该方法采用不同的参数类型(例如,将Integer更改为Long) 参数数量发生变化(例如传递另一个参数) 方法的返回类型更改(可能从String更改为Integer) 相反,如果没有简单的方法来证明computeSquare已经通过公共API完成了它应该做的事情,那么你的类可能会尝试做很多事情。将此方法拉入一个新类,它将为您提供以下测试:
现在(特别是当您使用现代IDE中提供的重构工具时),更改方法的名称对您的测试没有影响(因为您的IDE也将重构JUnit测试),同时更改参数类型,数量方法的参数或返回类型将在Junit测试中标记编译错误,这意味着您不会检查编译但在运行时失败的JUnit测试。 我的最后一点是,有时,特别是在使用遗留代码时,并且需要添加新功能时,在单独的可测试的良好编写的类中可能并不容易。在这种情况下,我的建议是将新的代码更改隔离到受保护的可见性方法,您可以直接在JUnit测试代码中执行这些方法。这允许您开始构建测试代码的基础。最终,您应该重构该类并提取您添加的功能,但与此同时,对新代码的受保护可见性有时可能是您在没有重大重构的可测试性方面的最佳前进方式。