有人为pojos编写测试用例吗?

5
需要我翻译吗?

听起来Ronald认为“pojos”只是值对象。 - Tim Frey
16个回答

7

除了简单的getter和setter之外,我会为所有内容编写明确的测试。

如果getter或setter仅包含return blah;或this.blah = blah;,我认为价值不大。这些大多数情况下都是自动生成的,我觉得把时间放在其他地方更有意义。


4
我认为这个问题在术语上有点混淆。POJO(Plain Old Java Object)是指没有依赖特定应用服务器或第三方库的Java对象。使用一个好的IOC(Inversion Of Control)框架,比如Spring,可以让你将所有类都写成POJO,这样你就可以独立地测试它们,而不必在测试中启动应用服务器。
Java bean是一个简单的Java类,包含私有属性和公共的getBlah()和setBlah()访问器方法,以及几乎没有其他内容。Java bean本质上是POJO。
因此,如果问题是“我应该测试我的POJOs(它们包含业务逻辑)吗?”那么答案是肯定的。
如果问题是“我应该测试我的Java beans(它们是没有行为的简单值对象)吗?”,那么答案可能是否定的。

2

如果您的PoJos(Java普通对象)包含对业务重要的逻辑,那么当然需要测试。

如果它们没有包含业务逻辑,那么就不必费心。有时候,留下一个没有测试的类很重要,因为这样可以让您在以后自由地重构它。


即使是可能进行重构的类,也应该有单元测试 - 它们也需要进行重构。 - Philip Helger

2
很容易就能说“当然”。但是,实际上,在真正的软件中,你有层层叠叠的组件。虽然很容易说你在堆栈底部的微小pojos太小而没有真正的错误,但当你在软件中遇到意外结果时,你需要将所有未经彻底测试的代码累加起来,这样你就会得到一整堆可疑的Jenga。

然而,如果你在构建更高级别的功能之前测试你的低级别例程,当出现问题时,你就知道该去哪里寻找(也就是在重新运行低级别例程的测试以确保没有发生变化后)。

还要记住,为你的pojos编写测试应该相对容易,因为模块提供的功能越少,需要测试的内容就越少。

我同意不测试getter和setter。


1

嗯,人们似乎忽略了另一个维度。

是的,当你想到POJO时,任何人脑海中想到的只有相应的获取器和设置器属性。但是,除此之外,POJO还可以通过覆盖equals()和hashCode()方法在集合中同样发挥作用。:) 在这种情况下,我的POJO值得经过适当的测试!:)

您应该使用不同可能的值测试多次,并确保equals()和hashCode()组合不提供重复值!


1

除了Getter和Setter,我是支持这种做法的。你必须在某个地方划定界限。


1
通常情况下,POJOs(Plain Old Java Object)会在某些上下文中进行测试。如果您想执行一些必须经过适当测试的逻辑(最好是在实现该逻辑之前),则必须进行测试。至于getter和setter方法,通常不需要测试,因为通过测试逻辑可得到覆盖率:-)尝试检查一些覆盖率报告工具,如Cobertura、Clover或尝试Emma并查看需要测试哪些内容。我真的很喜欢Clover报告,它可以显示代码中最危险的威胁。

1

所以,像这里其他人提到的一样,你需要测试它们。但是,如果你通过TDD来满足设计需求创建了它们,你会发现,一旦运行代码覆盖工具,那些POJO(或对于我们.net peeps来说是POCOs)将会被覆盖。这是因为TDD只允许你编写/重构由某个单元测试驱动的代码。

在我看来,这就是TDD比单元测试更好的原因。


0

即使是“普通”的getter和setter,你也需要这样做,原因如下:

  • 代码覆盖率 - 如果你使用cc工具,那么你会想要增加你的覆盖率
  • 将来有人可能会决定在你的getter或setter中放置一些逻辑,然后你的测试可能会失败,让开发者调整测试(提高意识)

虽然有一个自动生成这些测试的工具会很好...


0

POJO(普通 Java 对象)仍然可能包含逻辑错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接