2

我是编写单元测试的新手,在为以下场景编写测试用例时遇到了困难:

 Class A
 {
     public B createB(string name);
     public B getB(string name);
     public void removeB(B instance);
 }

 Class B
 {
     public B(string name);
 }

createB()如果特定名称的实例B已经存在,该方法将返回 null。因此,为了测试createB()成功完成的案例,我必须打电话getB()检查它是否存在然后removeB()将其删除:

 A a = getInstanceOfA();
 public void testCreateB()
 {
     B b = a.getB("B");
     if (b != null)
     {
         a.removeB(b);
     }
     assertNotNull(a.createB("B"));
 }

这违反了“一个测试用例必须失败只有一个原因”的规则,如果测试失败,我不知道问题出在哪里。测试getB()方法也是一样,createB()必须调用作为开始测试的先决条件。我正在使用 JUnit,每次开始测试时测试用例都会被打乱。是否有任何最佳实践来确保在这种情况下隔离测试用例?

还要注意,该getInstanceOfA()方法是从另一个库提供的 API 调用,并且无法控制获取A.

4

3 回答 3

1

看看像mockito这样的模拟框架,这会给开发者控制的其他函数一些模拟响应,你可以只测试需要的函数。

于 2013-03-20T03:47:54.657 回答
1

您需要将程序置于字符串“B”的已知状态,使用“B”调用 c​​reateB 方法并检查结果是否符合您的预期。然后你再次这样做,具有不同的状态和不同的预期结果。像这样:

public void testCreateBSucess() {
    A a = getInstanceOfA(); // Make sure "B" doesn't exists
    B b = a.createB("B");
    assertNotNull(b);
}

public void testCreateBFail() {
    A a = getInstanceOfA();
    a.createB("B"); // Making sure "B" exists
    B b = a.createB("B");
    assertNull(b);
}
于 2013-03-20T03:34:15.597 回答
0
  • 尝试将 JUnit 4 注释@Before@After您的方法一起使用。
  • 或者只是写一个复杂的长测试。在很多情况下,如果不违反测试编写的一般规则,您就无法编写测试。如果你真的需要,可以写一个很长的测试。
于 2013-03-20T03:58:52.557 回答