编写Java类时,使用IDE生成方法并不罕见,例如
toString()
equals()
hashCode()
但是一旦您使用IDE生成它们,它们就会成为您的代码库的一部分(在SCM中),因此所有质量测量方法都适用。
特别是equals和hashcode方法包含很多条件。如果我不编写单元测试,代码覆盖率(线条,条件,变异)的得分相当低,特别是如果被测试的类不那么大。
一些覆盖工具支持过滤(即cobertura),其他(即jacoco)不支持。但覆盖工具只显示了一个症状 - 未经测试的代码 - 因此我不是在问,是否要抑制/忽略症状,而是如何处理根本原因。
问题是:我应该为这些方法编写单元测试吗?
我并不是要求生成一般的类,比如JAXB pojos,WS-Clients等,它们可以很容易地自动生成并从覆盖率分析中排除。
答案 0 :(得分:12)
如果您生成这些方法,您可能也应该为它生成测试; - )
手动测试这些方法可能很麻烦,但根据您希望通过测试确保的方法,测试这些方法也许值得。反问题:你会测试日志声明吗?
这实际上取决于你想要完成的事情。有些人会说:不要,其他人可能会说:做。
考虑不测试此类方法的一些原因:
toString()
只会被日志或调试人员使用,因此您甚至无需关心。hashcode
和equals
测试此类方法的原因:
toString()
- 方法,并且不希望某些内容显示在那里。正如Hulk所说,你可能还想确保某些东西甚至不会出现在日志中。但这些都是相当弥补的。在上一个项目中,我没有对toString()
和equals
或hashCode
进行测试,因为它们没有被认为是必要的并且每个人都同意。
这可能归结为:您希望代码的安全性以及对您(或您的企业或客户有多少价值; - )
答案 1 :(得分:8)
IDE生成的hashCode / equals的问题是它可能与对象本身不同步(例如,当您添加新字段时)。因此,我建议为hashCode和equals创建测试。
手工编写这些文件当然是次优的。您可以使用EqualsVerifier项目等自动化工具将这些工具设为一行。
toString是一个不同的野兽,因为它没有定义任何合同。如果你只是为了获得更好的调试体验而使用toString,我就不会对它进行测试,只是将其从覆盖率计算中删除。
答案 2 :(得分:1)
是的,我将测试所有这些。不足以说,因为它们是自动生成的,所以不需要测试。有人可以轻松地添加一个新字段,而忘记重新生成equals /哈希码和字符串。
测试字符串可能是最有争议的,但是我认为这是必需的,尤其是在登录应用程序时。
正如其他人已经建议的那样,EqualsVerifier可能是测试等于和哈希码的最佳方法。
关于测试toString方法,请尝试ToStringVerifier。测试很简单:
@Test
public void testToString()
{
ToStringVerifier.forClass(User.class)
.withClassName(NameStyle.SIMPLE_NAME)
.verify();
}
答案 3 :(得分:0)
这些方法本身毫无用处。如果您不在集合中使用这些类(例如HashSet
/ HashMap
),或者您从未检查过这些类实例是否相等 - 那么您就不需要进行单元测试。而且,在这种情况下,我会禁用生成它们的插件,就像@ByeBye提出的那样。
但是,如果您真的这样做,则需要进行单元测试。如果不正确的实现可能导致应用程序失败或行为不正确 - 必须通过单元测试来实现此实现。
答案 4 :(得分:-1)
外部库相同 - 生成时不应测试equals
和hashcode
方法。检查覆盖范围的插件应该有一些机制来忽略生成的源。
没有充分的理由来测试生成的代码,如果这是您的类或整个类中生成的方法没有区别。
如果你依赖外部机制,你应该相信它是正确创造的。