在单元测试中使用反射是不好的做法吗?[副本]

这个问题在这里已经有答案了
如何测试具有私有方法、字段或内部类的类?

(57个答案)

三年前关闭的

在过去的几年中,我一直认为在Java中,反射在单元测试中被广泛使用。由于必须检查的一些变量/方法是私有的,因此有必要读取它们的值。我一直认为反射API也用于此目的

上周我不得不测试一些包,因此编写了一些JUnit测试。像往常一样,我使用反射来访问私有字段和方法。但检查代码的主管对此并不满意,并告诉我反射API不适用于这种“黑客行为”。相反,他建议修改生产代码中的可见性

使用反射真的很糟糕吗?我真不敢相信-

编辑:我应该提到,我被要求所有测试都在一个单独的名为test的包中(因此使用受保护的可视性,例如,也不是一个可行的解决方案)

IMHO反射实际上应该只是最后的手段,只用于单元测试遗留代码或不能更改的API的特殊情况。如果您正在测试自己的代码,那么您需要使用反射这一事实意味着您的设计是不可测试的,因此您应该解决这一问题,而不是求助于反射

如果您需要在单元测试中访问私有成员,这通常意味着所讨论的类具有不合适的接口,和/或尝试执行太多操作。因此,要么修改它的接口,要么将一些代码提取到一个单独的类中,这些有问题的方法/字段访问器可以公开

请注意,在一般情况下使用反射会导致代码更难理解和维护,而且代码也更脆弱。在正常情况下,编译器会检测到一整套错误,但通过反射,它们只会作为运行时异常出现

更新:正如@tackline所指出的,这只涉及在自己的测试代码中使用反射,而不是测试框架的内部。JUnit(可能还有所有其他类似的框架)使用反射来识别和调用您的测试方法——这是反射的合理和本地化使用。如果不使用反射,就很难或不可能提供相同的特性和便利。它完全封装在框架实现中,因此不会使我们自己的测试代码复杂化或受损

发表评论