如何为toString()方法编写junit测试用例

时间:2015-01-16 11:58:29

标签: java unit-testing junit tdd

非常需要tdd,junit,测试等。

我该怎么测试呢?

public String toString()
    {
        StringBuilder builder = new StringBuilder();
        builder.append(SalesExceptionHandlerImpl.class.getName() + " [");
        builder.append("toString()=");
        builder.append(super.toString());
        builder.append(", getClass()=");
        builder.append(getClass());
        builder.append(", hashCode()=");
        builder.append(hashCode());
        builder.append("]");
        return builder.toString();
    }

尝试的代码:

public class RMSalesExceptionHandlerImplTest {

    @Test
    public void toStringReturnAnEmptyString(){
        SalesExceptionHandlerImpl salesExceptionHandlerImpl = new SalesExceptionHandlerImpl();
        assert.areEqual(salesExceptionHandlerImpl.toString(), "");
    }
}

2 个答案:

答案 0 :(得分:3)

如果您知道方法的结果,那么您就不关心它的实现。 如果您的函数是toString,则必须简单地测试函数的结果。

public void testToString() {
    String result = "myResultThatIMustObtain";
    assertEquals(myInstance.toString(), result);

}

答案 1 :(得分:2)

你迟到了。使用TDD,您首先编写单元测试,然后执行。您已经实施但没有测试。您可以编写缺失的单元测试(完全没问题)或者您可以忘记当前的实现并尝试测试优先方法(如TDD)。

在测试中,首先从非常简单的测试开始。对于toString()方法,它可能类似于(使用JUnit for assertions):

public void toString_returnsEmptyString()
{
    SomeClass classUnderTest = new SomeClass();

    assertEquals(classUnderTest.toString(), "");
}

为什么你首先需要这样的测试?这可能看起来很愚蠢,但确保您可以毫无问题地创建测试环境(SomeClass实例)。这一点非常重要,因为在处理更复杂的测试和更复杂的问题时,您希望避免任何干扰。

一旦确定您可以创建对象并且可以返回一些字符串,则可以添加更多测试。像:

public void toString_returnsStringWithSuperClassToStringEmbedded()
{
    SomeClass classUnderTest = new SomeClass();

    assertThat(classUnderTest.toString(), contains("This is super's toString"));
}

然后添加适当的实现。

下一步是停止编写测试并检查是否可以重构任何内容(遵循Red-Green-Refactor咒语)。在这个阶段,很可能不是。这意味着您添加更多测试(getClass,hashCode,格式等)。冲洗&重复,直到你达到对测试和实施都满意的程度。

最终,你最终会进行大量测试。也许其中一些是多余的,你必须删除它们(就像你写的第一个测试)。也许其中一些可以合并为单一测试。也许您只需要一个测试来验证生成的字符串是否符合您的预期。但这就是TDD的含义 - 您的测试和实施通常会大量发展,直到达到最符合您要求的形式。