我正在使用junits测试两个对象,看来我需要覆盖对象中的equals
,以便junit可以执行有效的assertEquals。
但除了junits之外,代码中没有地方可以比较两个对象。因此,将单元测试放在一边,我从来不需要使用覆盖equals
。
这意味着我只为单元测试添加代码。
这是一个必要的邪恶吗?有什么工作吗?
答案 0 :(得分:0)
如果您要测试的对象的状态是可用的(例如,您想测试一个人的姓名并且您的Person
对象具有.getName()
),那么您可以编写自定义匹配器
如何编写这样的匹配器非常依赖于您使用的测试库,但这是使用TestNG和fest-assert时的一个非常小的示例:
import org.fest.assertions.GenericAssert;
import static org.testng.Assert.*;
public final class PersonAssert
extends GenericAssert<PersonAssert, Person>
{
private final Person person;
public static PersonAssert assertPerson(final Person person)
{
return new PersonAssert(message);
}
private PersonAssert(final Person person)
{
super(Person.class, person);
this.person = person;
}
public PersonAssert hasName(final String expected)
{
assertEquals(person.getName(), expected,
"Who is this guy? I expected " + expected + " but got " + person.getName());
return this;
}
public PersonAssert isOfAge(final int age) { /* etc */ }
// etc
}
在您的代码中,您可以使用:
import static my.package.PersonAssert.assertPerson;
// ...
assertPerson(person).hasName("Jimmy the hands");
答案 1 :(得分:0)
虽然当然可以实现自定义匹配器,就像fge建议的那样,我个人也经常选择在测试代码中覆盖equals,因为它通常更简单(例如使用IDE代码生成器)。基本上 - 在某些情况下 - 应该考虑盲目坚持做法不只是让你的生活变得更难......