我有一个Thing类,它包含各种Strings和一个Stuff集合。 我必须测试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();
}
}
答案 0 :(得分:2)
JUnit的想法是进行单元测试。我认为你应该测试一种特定的方法,你知道它应该做什么,而不是&#34;假装&#34;任何事情(我理解伪造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()实现,则会引入一个错误并返回&#34; cde&#34;那么你的具体测试用例就会失败。这是单元测试的理念。
我喜欢这个定义:
单元测试是软件测试过程中的一个级别 测试软件/系统的各个单元/组件。该 目的是验证软件的每个单元的执行情况 设计的。
在JUnit 4.x中,所有方法都有注释。因此,JUnit方法中的控制流程可以描述如下:
@BeforeClass -> @Before -> @Test -> @After -> @AfterClass
顺便说一句,你有不同程度的测试,单元测试是最小的&#34;。我不确定你需要什么,但也许你想进行整合测试。