当前位置: 首页 > 面试题库 >

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

广绪
2023-03-14
问题内容

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

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

使用Reflection真的不好吗?我真不敢相信-

编辑:我应该提到我被要求所有测试都放在称为测试的单独程序包中(因此,使用受保护的可见性,例如,也是不可能的解决方案)


问题答案:

恕我直言,反射实际上应该只是万不得已,保留用于单元测试遗留代码或无法更改的API的特殊情况。如果您正在测试自己的代码,那么您需要使用Reflection的事实意味着您的设计不可测试,因此您应解决此问题,而不要求助于Reflection。

如果您需要在单元测试中访问私有成员,则通常意味着所涉及的类具有不合适的接口,并且/或者尝试执行过多操作。因此,应该修改其接口,或者应该将某些代码提取到一个单独的类中,在这些类中可以将那些有问题的方法/字段访问器公开。

请注意,在一般情况下使用Reflection会导致代码变得更加困难,除了难以理解和维护之外。在通常情况下,编译器会检测到一整套错误,但是使用反射时,它们只会作为运行时异常而出现。

更新:
正如@tackline所指出的,这仅涉及在自己的测试代码中使用反射,而不涉及测试框架的内部。JUnit(可能还有其他所有类似的框架)使用反射来标识和调用您的测试方法-这是对反射的一种合理且局部的使用。如果不使用Reflection,将很难或不可能提供相同的功能和便利。OTOH完全封装在框架实现中,因此它不会使我们的测试代码复杂或妥协。



 类似资料:
  • 问题内容: 我的问题如下。我应该避免在Angular应用程序中使用任何种类的jQuery代码,因为与DOM交互只有一件事是合法的。另一个问题是,是否有人遇到无法找到其他解决方案但只能用jQuery快速编写代码的问题。 谢谢! 问题答案: 是的,这是一个不好的做法,但是有时它可以为您节省很多时间,特别是在您寻找插件时,仅在必要时执行此操作,并在其他解决方案可用时记下备注以将其切换回原来的状态。

  • 问题内容: 我正在开发一个显示图像并播放数据库声音的应用程序。我正在尝试确定是否使用单独的JFrame从GUI向数据库添加图像。 我只是想知道使用多个JFrame窗口是否是一种好习惯? 问题答案: 我只是想知道使用多个JFrames是否是一种好习惯? 坏习惯(坏习惯)。 用户不友好:用户只希望看到一个图标时,会在任务栏中看到多个图标。加上编码问题的副作用。 * 编写和维护代码的噩梦: * 一个模态

  • 使用DTO作为API模型是很常见的。通常,您需要在之后将这些DTO映射到其他模型。我将用下面的例子让它变得非常简单:

  • 问题内容: 我的意图是使用API中描述的JUnit方法来验证类中的一种方法。 但是Eclipse向我显示了无法识别这种方法的错误消息。这两个进口到位: 我错过了什么? 问题答案: 这应该适用于JUnit 4: (答案基于此Wiki文章) 这与旧的JUnit框架(JUnit 3)相同: 注意区别:没有注释,测试类是TestCase的子类(实现静态断言方法)。

  • 问题内容: 我想知道使用语句退出循环而不是满足循环条件是否是“坏习惯” ? 我对Java和JVM的了解不足,无法知道如何处理循环,因此我想知道我是否通过这样做忽略了一些关键的事情。 这个问题的重点:是否有特定的性能开销? 问题答案: 好主啊 有时,可能会在满足整体要求的循环中发生某些事情,而不满足逻辑循环条件。在这种情况下,用于阻止您毫无意义地循环。 例 在此示例中更有意义的是。每次找到后都继续循

  • 问题内容: 我最近开始使用“注释”出CSS代码的每一行。我了解到我实际上并没有发表评论。我只是在破坏它(我应该使用),但是它具有相同的效果。然后,该行以终止,以下代码可以正常工作。 我可以删除它,但是通常我不想这样做,以防以后要放回去,或者如果我回头看看我一直在使用什么。 例: 我可以解决这个问题,还是可能导致我出现问题? 问题答案: 首先,最重要的是:注释掉的代码是 代码的味道 ,应避免使用。我