添加代码只是为了单元测试的缘故

时间:2014-03-23 18:45:49

标签: java junit

我正在使用junits测试两个对象,看来我需要覆盖对象中的equals,以便junit可以执行有效的assertEquals。

但除了junits之外,代码中没有地方可以比较两个对象。因此,将单元测试放在一边,我从来不需要使用覆盖equals

这意味着我只为单元测试添加代码。

这是一个必要的邪恶吗?有什么工作吗?

2 个答案:

答案 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代码生成器)。基本上 - 在某些情况下 - 应该考虑盲目坚持做法不只是让你的生活变得更难......