我有一个 junit testCase 类,其中包含多个测试方法(根据要求,我们不想为每个测试创建单独的类。)
我想为每个测试方法创建一个 tearDown
类型方法,它将专门为该测试运行。不适用于所有测试。
我的问题是,在许多测试中我在数据库中插入记录,测试它并在测试后删除它。 但是,如果测试中途失败,控制不会到达最后,我的虚拟记录不会被删除。
我认为一个类只允许有一个tearDown()
,并且这个tearDown()
不知道我创建或插入了什么对象/记录以及要做什么删除!!!
我想仅为一个特定测试创建一个 tearDown()
或 @After
方法。对于每个方法,类似于 Java 中的 finally{}
。
例如:
public class TestDummy extends TestCase {
public void testSample1(){
InsertSomeData1();
assertFalse(true);
runTearDown1();
}
public void testSample2(){
InsertSomeData2();
assertFalse(true);
runTearDown2();
}
public void runTearDown1(){
deleteDummyDatafromTestSample1....
}
public void runTearDown2(){
deleteDummyDatafromTestSample2....
}
}
这里的控件永远不会转到 runTearDown1()
或 runTearDown2()
并且我没有一个常见的 tearDown()
因为它不知道我插入了哪些数据以及特定于每种方法的数据。
最佳答案
看来您的测试依赖于固定的数据库,如果您当前的测试失败, future 的测试也会失败。我建议不要关注这个特定问题(为每个测试运行的特定于测试的tearDown 方法),而是关注你的主要问题 - borken 测试。在测试运行之前,它应该始终使用干净的数据库,并且每个测试都应该如此。现在,您的第一个测试与第二个测试有关系(通过数据库)。
正确的方法是在每次测试之前重新创建数据库,或者至少将其重置为基本状态。在这种情况下,您需要进行如下测试:
public class TestDummy {
// this code runs (once) when this test class is run.
@BeforeClass
public void setupDatabase() {
// code that creates the database schema
}
// this code runs after all tests in this class are run.
@AfterClass
public void teardownDatabase() {
// code that deletes your database, leaving no trace whatsoever.
}
// This code runs before each test case. Use it to, for example, purge the
// database and fill it with default data.
@Before
public void before() {
}
// You can use this method to delete all test data inserted by a test method too.
@After
public void after() {
}
// now for the tests themselves, we should be able to assume the database will
// always be in the correct state, independent from the previous or next test cases.
@Test
public void TestSample2() {
insertSomeData();
assertTrue(someData, isValid());
}
}
免责声明:JUnit 4 测试(使用注释)可能不是正确的注释,甚至可能不是正确的答案。
关于java - 如何在具有多个测试的 JUnit 类中为特定测试运行tearDown 类型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5046335/