如何为 toString() 方法编写 junit 测试用例
how to write a junit test case for a toString() method
非常需要 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(), "");
}
}
如果你知道你的方法的结果,你就不会关心它的实现。
如果您的函数是一个 toString,您必须简单地测试您的函数的结果。
public void testToString() {
String result = "myResultThatIMustObtain";
assertEquals(myInstance.toString(), result);
}
你迟到了。使用 TDD,您首先编写单元测试,然后再进行实现。您已经实施,但没有测试。您可以编写缺少的单元测试(这完全没问题),或者您可以忘记当前的实现并尝试 test-first 方法(如 TDD)。
在测试第一中,您首先从非常简单的测试开始。对于 toString()
方法,它可能类似于(使用 JUnit for assertions):
public void toString_returnsEmptyString()
{
SomeClass classUnderTest = new SomeClass();
assertEquals(classUnderTest.toString(), "");
}
为什么你首先需要这样的测试?这可能看起来很愚蠢,但它是为了确保您可以毫无问题地创建测试环境(SomeClass
实例)。这一点非常重要,因为您希望在处理更复杂的测试和更复杂的问题时避免分心。
一旦确定您可以创建您的对象并且您可以return一些字符串您可以添加更多测试。喜欢:
public void toString_returnsStringWithSuperClassToStringEmbedded()
{
SomeClass classUnderTest = new SomeClass();
assertThat(classUnderTest.toString(), contains("This is super's toString"));
}
然后添加适当的实现。
下一步将是停止编写测试并检查您是否可以重构任何东西(遵循 Red-Green-Refactor 咒语)。在这个阶段,很可能不会。这意味着您添加了更多测试(getClass、hashCode、格式化等)。冲洗并重复,直到达到您对测试和实施都满意的程度。
最终,你会得到一堆测试。也许其中一些是多余的,您必须删除它们(就像您编写的第一个测试一样)。也许其中一些可以合并到单个测试中。也许您只需要一个测试来验证生成的字符串的形状是否与您期望的完全一样。但这就是 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(), "");
}
}
如果你知道你的方法的结果,你就不会关心它的实现。 如果您的函数是一个 toString,您必须简单地测试您的函数的结果。
public void testToString() {
String result = "myResultThatIMustObtain";
assertEquals(myInstance.toString(), result);
}
你迟到了。使用 TDD,您首先编写单元测试,然后再进行实现。您已经实施,但没有测试。您可以编写缺少的单元测试(这完全没问题),或者您可以忘记当前的实现并尝试 test-first 方法(如 TDD)。
在测试第一中,您首先从非常简单的测试开始。对于 toString()
方法,它可能类似于(使用 JUnit for assertions):
public void toString_returnsEmptyString()
{
SomeClass classUnderTest = new SomeClass();
assertEquals(classUnderTest.toString(), "");
}
为什么你首先需要这样的测试?这可能看起来很愚蠢,但它是为了确保您可以毫无问题地创建测试环境(SomeClass
实例)。这一点非常重要,因为您希望在处理更复杂的测试和更复杂的问题时避免分心。
一旦确定您可以创建您的对象并且您可以return一些字符串您可以添加更多测试。喜欢:
public void toString_returnsStringWithSuperClassToStringEmbedded()
{
SomeClass classUnderTest = new SomeClass();
assertThat(classUnderTest.toString(), contains("This is super's toString"));
}
然后添加适当的实现。
下一步将是停止编写测试并检查您是否可以重构任何东西(遵循 Red-Green-Refactor 咒语)。在这个阶段,很可能不会。这意味着您添加了更多测试(getClass、hashCode、格式化等)。冲洗并重复,直到达到您对测试和实施都满意的程度。
最终,你会得到一堆测试。也许其中一些是多余的,您必须删除它们(就像您编写的第一个测试一样)。也许其中一些可以合并到单个测试中。也许您只需要一个测试来验证生成的字符串的形状是否与您期望的完全一样。但这就是 TDD 的本质——您的测试和实现通常会发生很大变化,直到它们达到最适合您要求的形式。