【问题标题】:How to write Unit test for a group of methods in which each method depends on others?如何为一组方法编写单元测试,其中每个方法都依赖于其他方法?
【发布时间】:2013-03-20 03:10:32
【问题描述】:

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

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

 Class B
 {
     public B(string name);
 }

如果特定名称的B 实例已经存在,则方法createB() 将返回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 的“干净”实例。

【问题讨论】:

    标签: java unit-testing junit4 method-group


    【解决方案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);
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:
        • 尝试在您的方法中使用 JUnit 4 注释,例如 @Before@After
        • 或者只是编写一个复杂的长测试。在很多情况下,如果不违反测试编写的一般规则,您就无法编写测试。没关系。如果你真的需要,写一个很长的测试。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-06
          • 2021-07-03
          • 1970-01-01
          • 2022-08-11
          • 1970-01-01
          相关资源
          最近更新 更多