【问题标题】:Spring/JUnit - Run something before ANY testsSpring/JUnit - 在任何测试之前运行一些东西
【发布时间】:2018-01-08 16:43:43
【问题描述】:

Spring 或 JUnit 运行器是否有一些东西可以在运行任何测试之前用来运行代码?

我找到的最接近的是@Rule@ClassRule,它们在类级别上工作。

我有一个 Docker @ClassRule,它托管一个空数据库,用于空集成测试。使用@ClassRule,每次都会重启容器。

我宁愿在启动测试时只启动一次(无论是所有测试还是一个测试),运行测试,然后终止容器。

我四处寻找,但除了班级规则外,我没有找到任何其他东西。如果我遗漏了一些明显的东西,请道歉。

【问题讨论】:

  • @Before 或@BeforeClass 不满足您的要求?
  • @Barath 我正在寻找每组测试运行一次的东西。所以,如果我运行所有测试,我想要的东西只会触发一次,而不是每个班级一次 (@BeforeClass) 或每个测试一次 (@Before)
  • 就我而言,我正在寻找一种方法来启动 dockerized 数据库,以便我可以再次运行测试。我不想在每个测试或课程中启动一个新的,因为它太慢了。自从我发布它以来,我们已经在下面的答案中使用了代码,它仍然很好用。

标签: java spring junit


【解决方案1】:

似乎 Spring 和 JUnit 并没有直接做这件事。经过一番谷歌搜索后,我发现了一些启发灵感的地方。

使用扩展 ExternalResource(来自 JUnit)的自定义规则,我有点自欺欺人,但它可以满足我的需求:

public class MyRule extends ExternalResource {
  static private MyRule instance;

  static public MyRule get() {
    if (instance == null) {
      instance = new MyRule();
    }

    return instance;
  }

  private MyRule() {
    // do init stuff

    Runtime.getRuntime().addShutdownHook(new Thread(() -> {
      // do shutdown stuff
    });
  }
}

基本思想是规则是单例的。在每个可能需要它的类中,我会添加一个@ClassRule

 public class MyTest {
   @ClassRule
   private MyRule myRule = MyRule.get();
 }

它会延迟初始化自己,这将完成所有需要的设置。它还将注册一个关闭钩子,然后它将处理任何后续内容。

使用此模式,它会在任何测试(需要此规则)运行之前只运行一次代码,并且仅在所有测试完成后才在最后执行关闭代码。

注意:它故意不覆盖before()after() 函数,因为它们是在每个类之前和之后。如果你也想在类之间做一些事情,你可以在那里添加一些东西。

【讨论】:

    【解决方案2】:

    也许您正在寻找的是这 2 个注释:

    @BeforeClass

    @Before

    @Before 在每次测试之前运行,而@BeforeClass 只运行一次

    你可以这样使用它:

    @Before
    public void setUp(){
    // start container here
    }
    

    你也有等效的测试后:@After@AfterClass

    你会发现一个很好的解释here

    谢谢

    【讨论】:

    • 我需要每次运行一次的东西,而不是每个班级或每个测试一次。
    • @samanime 那么如果你使用 JUnit 5 你有 @BeforeAll 这似乎可以解决问题!示例here
    • 不幸的是,即使@BeforeAll 似乎仍然是类级别的。我正在尝试找到一个对于多个类的整个运行只触发一次的东西。
    • 那么也许你应该制作一个测试套件而不是多个测试类。我对此了解不多,但也许this answer 可以帮助你?
    • 抱歉打错了:我不太了解
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多