Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为一组方法编写单元测试,其中每个方法都依赖于其他方法?_Java_Unit Testing_Junit4_Method Group - Fatal编程技术网

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

Java 如何为一组方法编写单元测试,其中每个方法都依赖于其他方法?,java,unit-testing,junit4,method-group,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); } 如果特定名称已经存在的B实例,则方法createB()将返回null。因此,为了测试案例createB

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

 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

的“干净”实例是不可控的。您需要将程序置于字符串“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);
}

看看mockito之类的模拟框架,这将对开发人员控制的其他功能给出一些模拟响应,您可以只测试所需的功能。

  • 尝试在方法中使用JUnit4注释,如
    @Before
    @After
  • 或者只是编写一个复杂的长测试。在很多情况下,如果不违反测试编写的一般规则,就无法编写测试。如果你真的需要,可以写一个很长的测试