2

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

4

3 回答 3

2

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

@After定义必须在 every 之后执行某个方法@Test,while@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.
}

注意:通过在方法之前和开始执行在该类上定义的 s之前调用相关方法,它们的对应物 (@Before和) 正好相反。这是在以前版本的 JUnit 中使用的。@BeforeClass@Test@TestsetUp


如果您不能使用注释,则另一种方法是使用良好的旧tearDown方法:

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

这是由 JUnit 框架提供的,其行为类似于使用@After.

于 2013-07-31T15:59:08.930 回答
1

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

于 2013-07-31T15:58:49.480 回答
1

在您的 junit 测试类中,您可以覆盖方法setupteardown. setup将在您的每个测试之前运行,而teardown将在您拥有的每个 junit 测试之后运行。

前任:

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
}

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

于 2013-07-31T16:00:36.147 回答