如何为一组方法编写单元测试,其中每种方法都依赖于其他方法?

时间:2013-03-20 03:10:32

标签: java unit-testing junit4 method-group

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

 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的“干净”实例。

3 个答案:

答案 0 :(得分:1)

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

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);
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

  • 尝试在您的方法中使用@Before@After等JUnit 4注释。
  • 或者只是写一个复杂的长测试。在很多情况下,如果不违反一般测试编写规则而无法编写测试。它是O.K.如果你真的需要的话,写一个很长的测试。