我正在测试微型搜索引擎的不同部分,并且一些JUnit测试在索引中留下干扰其他测试的条目。 JUnit / Maven中是否存在用于在测试之间清除对象的约定?
答案 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测试类中,您可以覆盖方法setup
和teardown
。 setup
将在每次测试之前运行,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
}
这对于清除测试之间的数据很有用,但也允许您不必在每次测试中重新初始化字段。