java - 测试时用反射破坏封装有多邪恶?

标签 java testing reflection

我正在测试 3 个新类,它们生成 3 个序列化到数据库的对象集合。其中 1 个类具有硬编码的字符串数组。这 3 个集合最终与字符串数组大小相同,并且集合中的每个对象都根据数组中的字符串获得一个名称/标签。

我的一个测试是端到端测试,它将尝试制作所有三个集合。我想访问用于测试的字符串数组,但它是私有(private)的。我看到了三种可能的方法来处理这个问题:

  • 使其受到保护 <- Office 的政策是不得为了测试而修改代码设计。
  • 将数组复制到测试类 <- 现在必须在两个位置维护数组更改。噢。
  • 使用反射来窥视隐私 <- 这行得通,但它是否比替代方案更邪恶?

你能想到第四种方法吗?有充分的理由不为此使用反射吗?

最佳答案

这实际上取决于您的测试要锻炼的内容。一般来说,如果您正在测试代码的内部实现细节,那么您的测试可能做错了。毕竟,您的测试应该测试代码的可观察效果,而不是实现细节。执行实现细节的测试是脆弱的(需要在实现发生变化时进行更新)并且通常只是实现的副本。此外,因为它们反射(reflect)了实现,实现中的错误也可能反射(reflect)在测试中,因此此类测试通常具有可疑的值(value)。

一个更好的方法是使用一个接口(interface)来表示您的数据库对象并使用模拟框架,例如 mockito验证您期望的数据是否已写入数据库和从数据库读取,而无需检查代码在将数据写入数据库之前如何在内部存储数据的内部结构。

此外,就不要为测试编写不同的代码而言...一般来说,最好不要在生产代码中使用仅测试方法。但是,重构代码以使其更加模块化(因此更易于测试)通常是一种很好的编码实践。

关于java - 测试时用反射破坏封装有多邪恶?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23486707/

相关文章:

c# - 从内部访问器反射(reflect)属性名称?

java - 如何禁用作业进度栏对话框上的取消按钮?

java - 在带有 Glassfish 4 的 Netbeans 8 中包含用于 ResourceConfig 的 Jersey

php - 在 Symfony 2.8 中删除 "Remaining deprecation notices"

testing - 如何创建虚拟组件以用于 Ember 集成测试?

.net - 衡量函数、类和进程速度的最佳方法

java - 使用 Java Nashorn 加载 'quests'

java - Spring和MVC正确的项目结构

reflection - 在 Go 中使用反射设置 slice 索引

android - 在 AOSP 设备上保持 Wifi-Direct 打开