如何在静态@AfterClass中使用注入

问题描述 投票:0回答:1

我正在使用JUnit 4测试用例,并且我想使用@AfterClass批注。要使用它,使用它的方法必须是静态的。在这种方法中,我想使用我的@Inject ed对象。

但是似乎它们不能是静态的,即,如果它们是静态的,则在测试运行期间为null。实际上,我想在运行完所有测试之后删除某些数据库对象,并且不想使用@After

我该如何解决这个问题?我唯一想到的就是按字母顺序运行测试用例,并使zzz()应用我想要的逻辑。

不使用Spring,使用Arquillian并在测试时将耳朵部署到服务器

java static junit4 jboss-arquillian
1个回答
2
投票

首先:由于本质上单元测试(根据定义彼此独立)和数据库(本质上是有状态的)完全不同,因此涉及数据库的单元测试并不是那么简单。

通常不建议您在所有测试之后删除某些数据库对象的方法。在大多数情况下,更好的方法是:

  1. 每个单个测试之前将数据库设置为已知状态(原因:测试更易于管理,并且不会互相干扰。]
  2. 保持数据库状态不变(原因:某些测试失败时,能够“手动”检查数据库状态的能力非常有用
  3. )。

    为了实现上述目标,有一些工具。一种是针对数据库填充的出色的Arquillian Persistence Extension。另外一个是DbSetup(这是我的最爱)。


也存在替代方案

[如果不适合使用其他工具,那么您应该知道Arquillian的JUnit集成提供了一个方便的@InSequence批注,该批注可用于设置测试执行的明确顺序。

@Test
@InSequence(1)
public void place_order_should_add_order() {

    // some logic here
}

@Test
@InSequence(2)
public void order_should_be_persistent() {
    // some logic here that depends on the previous test-case 
}

这远比依赖于方法名称的字母顺序更好。

还请注意,上述方法不是静态的,因此您可以在其中使用容器注入的任何对象,例如DataSourceEntityManager等。>

© www.soinside.com 2019 - 2024. All rights reserved.