如何在JUnit / Maven测试之间清除对象?

时间:2013-07-31 15:49:00

标签: java unit-testing maven junit

我正在测试微型搜索引擎的不同部分,并且一些JUnit测试在索引中留下干扰其他测试的条目。 JUnit / Maven中是否存在用于在测试之间清除对象的约定?

3 个答案:

答案 0 :(得分:2)

有2个特定的注释可以帮助您解决这个问题,并且可以用于像您这样的情况:

@After定义必须在每个@Test之后执行某个方法,而@AfterClass是在执行整个测试类后执行的方法。将后者视为最后清理方法,以清除您目前使用的任何结构或记录,并在目前的测试之间共享。

以下是一个例子:

@After
public void cleanIndex() {
    index.clear(); //Assuming you have a collection
}

@AfterClass
public void finalCleanup() {
    //Clean both the index and, for example, a database record.
}

注意:他们的对手(@Before@BeforeClass)通过在@Test方法之前和开始之前调用相关方法而完全相反执行在该类上定义的@Test。这些是以前版本的JUnit中使用的setUp


如果您不能使用注释,则可以选择使用旧的tearDown方法:

public void tearDown() {
    index.clear(); //Assuming you have a collection.
}

这是由JUnit框架提供的,其行为类似于使用@After注释的方法。

答案 1 :(得分:1)

您应该使用@Before注释来保证每个测试都从干净状态运行。请参阅:Test Fixtures

答案 2 :(得分:1)

在junit测试类中,您可以覆盖方法setupteardownsetup将在每次测试之前运行,teardown将在您进行的每次单一测试后运行。

例如:

public class JunitTest1 {

    private Collection collection;

    //Will initialize the collection for every test you run
    @Before
    public void setUp() {
        collection = new ArrayList();
        System.out.println("@Before - setUp");
    }

    //Will clean up the collection for every test you run
    @After
    public void tearDown() {
        collection.clear();
        System.out.println("@After - tearDown");
    }

    //Your tests go here
}

这对于清除测试之间的数据很有用,但也允许您不必在每次测试中重新初始化字段。