在 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 TestWatcherstarting 方法中创建此对象的实例并将其保存在字段中。然后我在测试 class 中使用 @Rule 通过 TestWatcher 实现中的 getter 方法访问此实例。

所以我的问题基本上是:

1)在@Before方法中预置数据库,在@After方法中删除所有数据是否是一种好的做法?因此,如果下一次测试只需要加载少量数据,它会 运行 快得多。

2) 如何在 @After 方法中访问在 @Before 方法中创建的同一对象实例。必须保证是同一个实例,即使并行测试运行。我的两个想法哪个好实现,哪个更好?

谢谢!

  1. 恕我直言,没有。我在使用 DbSetup 时推荐的良好做法(请参阅 http://dbsetup.ninja-squad.com/user-guide.html#dont-cleanup-prepare 以获得更详细的解释)是在测试前清除数据库并插入必要的数据,并且在测试后不执行任何操作。这样,您就可以确定数据库在开始测试时包含您想要的内容(即使之前的测试未能清理),并且您可以在测试失败后检查数据库,以诊断问题。

  2. 使用字段。 JUnit 为每个测试创建一个新的测试实例 class。