【问题标题】:Is adding code just for unit testing sake accepted practice只是为了单元测试而添加代码是公认的做法
【发布时间】:2014-03-23 18:45:48
【问题描述】:

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

但是除了junits,我不需要在代码中比较两个对象。因此,将单元测试放在一边,我从不需要使用覆盖的equals

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

这是必要的邪恶吗?有什么解决办法吗?

【问题讨论】:

标签: java junit


【解决方案1】:

如果您要测试的对象的状态可用(例如,您要测试一个人的姓名,而您的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");

【讨论】:

    【解决方案2】:

    虽然当然可以实现自定义匹配器,就像 fge 建议的那样,但我个人也经常选择在测试代码中覆盖 equals,因为它通常更简单(例如使用 IDE 代码生成器)。基本上——在某些情况下——人们应该考虑一味地坚持实践是否不仅仅是让你的生活变得更艰难......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-14
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      相关资源
      最近更新 更多