junit 治具

示例

从维基百科:

测试装置是用于一致地测试某些项目,设备或软件的工具。

通过从测试方法本身中提取通用的初始化/终结代码,它也可以提高测试的可读性。

可以在一次测试之前而不是在每个测试之前执行一次通用初始化的地方,这也可以减少运行测试所花费的时间。

下面的示例旨在显示JUnit提供的主要选项。假设一个类的Foo初始化费用很高:

public class Foo {
    public Foo() {
        // 昂贵的初始化
    }

    public void cleanUp() {
        // 清理资源
    }
}

另一个类Bar引用了Foo:

public class Bar {
    private Foo foo;
    
    public Bar(Foo foo) {
       this.foo= foo;
    }

    public void cleanUp() {
        // 清理资源
    }
}

以下测试期望包含单个的List的初始上下文Bar。

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.Arrays;
import java.util.List;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class FixturesTest {
    
    private static Foo referenceFoo;
    
    private List<Bar> testContext;
    
    @BeforeClass
    public static void setupOnce() {
        // 在进行任何测试之前调用一次
        referenceFoo = new Foo();
    }

    @Before
    public void setup() {
        // 在每次测试运行前调用
        testContext = Arrays.asList(new Bar(referenceFoo));
    }
    
    @Test
    public void testSingle() {
        assertEquals("Wrong test context size", 1, testContext.size());
        Bar baz = testContext.get(0);
        assertEquals(referenceFoo, baz.getFoo());
    }
    
    @Test
    public void testMultiple() {
        testContext.add(new Bar(referenceFoo));
        assertEquals("Wrong test context size", 2, testContext.size());
        for (Bar baz : testContext) {
            assertEquals(referenceFoo, baz.getFoo());
        }
    }
    
    @After
    public void tearDown() {
        // 每次测试运行后调用
        for (Bar baz : testContext) {
            baz.cleanUp();
        }
    }
    
    @AfterClass
    public void tearDownOnce() {
        // 所有测试运行后调用一次
        referenceFoo.cleanUp();
    }
}

在示例中,带@BeforeClass注释的方法setupOnce()用于创建Foo对象,初始化起来很昂贵。重要的是不要通过任何测试对其进行修改,否则测试运行的结果可能取决于各个测试的执行顺序。这个想法是每个测试都是独立的,并且测试一个小功能。

带@Before注释的方法setup()设置测试上下文。可以在测试执行期间修改上下文,这就是为什么必须在每次测试之前对其进行初始化的原因。通过在每个测试方法的开始都包含此方法中包含的代码,可以达到等效的效果。

带@After注释的方法tearDown()清除测试上下文中的资源。在每次测试调用之后都会调用它,因此通常用于释放在带@Before注释的方法中分配的资源。

一旦所有测试都运行,带@AfterClass注释的方法将tearDownOnce()清理资源。这种方法通常用于释放初始化期间或@BeforeClass注释方法中分配的资源。就是说,最好避免在单元测试中使用外部资源,以使测试不依赖于测试类之外的任何内容。