【问题标题】:How can I test if this object returns the correct String?如何测试此对象是否返回正确的字符串?
【发布时间】:2014-06-10 20:10:01
【问题描述】:

我有一个 Thing 类,其中包含各种字符串和一组东西。 我必须测试 Message 类是否可以在 MessageTest 类中正确地将 item 作为 "found" 返回。

什么是最优雅/最有效的测试方法?

我应该创建什么样的假对象,我该如何测试/反对它?

public class Thing
{
    public String a;
    public String b;
    public String c;
    public String d;
    public String e;
    public Collection<Stuff> collection;
}

public class Message
{
    private String item;

    public Message(Thing thing)
    {
        for (Stuff stuff : thing.collection)
        {
            if (stuff.getItem().equals("key"))
            {
                item = "found";
            }
        }
    }


@Override
public String toString()
{
    StringBuilder builder = new StringBuilder();
    builder.append(a);
    builder.append(b);
    builder.append(c);
    builder.append(d);
    builder.append(e);
    builder.append(item);
    return builder.toString();
}
}

【问题讨论】:

  • 我亲自阅读了这篇关于 jUnit 的精彩教程,发现它非常清晰且写得很好:vogella.com/tutorials/JUnit/article.html
  • 看起来你不需要伪造任何东西。只需让您的每个测试用例构造一个合适的Thing,将其传递给Message,然后断言toString 结果的内容。
  • 我会假设Message 要么对item 做某事,要么通过getter 公开它。这就是我要断言的。我不会断言toString(),因为很多人(包括我)只是非正式地使用它来进行日志记录和调试。因此,它的格式可能会因与您要测试的功能完全无关的原因而改变。而且您不希望每次发生这种情况时都必须调整您的测试。

标签: java unit-testing testing junit


【解决方案1】:

JUnit 的理念是进行单元测试。我认为您应该测试一种您知道它应该做什么的特定方法,而不是“伪造”任何东西(我理解mocking 是伪造的),例如:

import static org.junit.Assert.assertEquals;

import org.junit.Test;

public class PayrollTesCase {

    @Test
    public void testCalculate() {
        Message m = new Message(new Thing("a", "b", "c", "d", "e"));
        assertEquals("abcde", m.toString());
    }

}

因此,如果将来您更改 Message.toString() 实现,您引入了一个错误并且它返回“cde”,那么您的特定测试用例将失败。这就是单元测试背后的理念。

我喜欢这个定义:

单元测试是软件测试过程的一个级别,其中 测试软件/系统的各个单元/组件。这 目的是验证软件的每个单元的执行情况 设计的。

在 JUnit 4.x 中,所有方法都带有注释。因此,JUnit 方法中的控制流程可以描述如下:

@BeforeClass -> @Before -> @Test -> @After -> @AfterClass

顺便说一下,你有不同程度的测试,单元测试是“最小的”。我不确定你需要什么,但也许你想做一个集成测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    相关资源
    最近更新 更多