java - 如何在具有多个测试的 JUnit 类中为特定测试运行tearDown 类型方法?

标签 java junit junit4

我有一个 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/

相关文章:

java - 无法在VS代码中运行测试

java - 使用哪种方法来对该组件进行单元测试?善于交际还是独来独往?

java - 使用 Cobertura 时如何忽略 Logger 相关的 If 条件?

junit - 断言 JUnit 中的列表不为空

java - Spring 安全: Set Remember me Service while using AbstractPreAuthenticatedProcessingFilter

java - 在 Java 中将 XML 转换为 JSON 的最快方法

java - 如何模拟DriverManager.getConnection?

java - 如何将 JUnit4 的测试通过/失败结果记录到文件中?

java - 如何创建一个 JUnit 测试,该测试在满足特定条件之前一直运行?

Java:无法在 JUnit 测试中读取数据文件