在 JUnit4 测试中访问 @Before 和 @After 中的同一对象实例
Accessing same instance of an object in @Before and @After in a JUnit4 test
我正在使用 JUnit 4 测试数据库应用程序。由于每个测试都需要在 运行s 之前对数据库进行特殊预设,因此我使用 @Before
方法首先加载数据,然后使用 @After
方法从数据库中删除所有数据.由于某些原因,我不能使用 DBUnit,但我必须使用一些自定义 Java 实现来完成数据库加载和清理工作。虽然我可以在 @Before
方法中从这个自定义实现创建一个 class 的实例,但重要的是我在 @After
方法中获得相同的实例。
我的第一个想法是在测试class中使用一个字段(例如myObject
)并在@Before
方法中设置它,这样我就可以在@After
再次方法。但是,我不确定 JUnit 生命周期以及它在并行测试 运行 时的行为方式,即如果 myObject
将被覆盖。
另一个想法是使用 JUnit TestWatcher
在 starting
方法中创建此对象的实例并将其保存在字段中。然后我在测试 class 中使用 @Rule
通过 TestWatcher
实现中的 getter 方法访问此实例。
所以我的问题基本上是:
1)在@Before
方法中预置数据库,在@After
方法中删除所有数据是否是一种好的做法?因此,如果下一次测试只需要加载少量数据,它会 运行 快得多。
2) 如何在 @After
方法中访问在 @Before
方法中创建的同一对象实例。必须保证是同一个实例,即使并行测试运行。我的两个想法哪个好实现,哪个更好?
谢谢!
恕我直言,没有。我在使用 DbSetup 时推荐的良好做法(请参阅 http://dbsetup.ninja-squad.com/user-guide.html#dont-cleanup-prepare 以获得更详细的解释)是在测试前清除数据库并插入必要的数据,并且在测试后不执行任何操作。这样,您就可以确定数据库在开始测试时包含您想要的内容(即使之前的测试未能清理),并且您可以在测试失败后检查数据库,以诊断问题。
使用字段。 JUnit 为每个测试创建一个新的测试实例 class。
我正在使用 JUnit 4 测试数据库应用程序。由于每个测试都需要在 运行s 之前对数据库进行特殊预设,因此我使用 @Before
方法首先加载数据,然后使用 @After
方法从数据库中删除所有数据.由于某些原因,我不能使用 DBUnit,但我必须使用一些自定义 Java 实现来完成数据库加载和清理工作。虽然我可以在 @Before
方法中从这个自定义实现创建一个 class 的实例,但重要的是我在 @After
方法中获得相同的实例。
我的第一个想法是在测试class中使用一个字段(例如myObject
)并在@Before
方法中设置它,这样我就可以在@After
再次方法。但是,我不确定 JUnit 生命周期以及它在并行测试 运行 时的行为方式,即如果 myObject
将被覆盖。
另一个想法是使用 JUnit TestWatcher
在 starting
方法中创建此对象的实例并将其保存在字段中。然后我在测试 class 中使用 @Rule
通过 TestWatcher
实现中的 getter 方法访问此实例。
所以我的问题基本上是:
1)在@Before
方法中预置数据库,在@After
方法中删除所有数据是否是一种好的做法?因此,如果下一次测试只需要加载少量数据,它会 运行 快得多。
2) 如何在 @After
方法中访问在 @Before
方法中创建的同一对象实例。必须保证是同一个实例,即使并行测试运行。我的两个想法哪个好实现,哪个更好?
谢谢!
恕我直言,没有。我在使用 DbSetup 时推荐的良好做法(请参阅 http://dbsetup.ninja-squad.com/user-guide.html#dont-cleanup-prepare 以获得更详细的解释)是在测试前清除数据库并插入必要的数据,并且在测试后不执行任何操作。这样,您就可以确定数据库在开始测试时包含您想要的内容(即使之前的测试未能清理),并且您可以在测试失败后检查数据库,以诊断问题。
使用字段。 JUnit 为每个测试创建一个新的测试实例 class。