java - Spring/JUnit - 在任何测试之前运行一些东西

标签 java spring junit

Spring 或 JUnit 运行程序是否有一些东西可以让我在运行任何测试之前运行代码?

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

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

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

我四处寻找,但除了类(class)规则外,我没有发现任何其他东西。如果我遗漏了一些明显的东西,请道歉。

最佳答案

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();
 }

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

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

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

关于java - Spring/JUnit - 在任何测试之前运行一些东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48154530/

相关文章:

java - 对特定问题添加评论

java - jetty-maven-plugin 不适用于 Maven 3

java - 获取我在 Spring/Java/Oracle 中更新的行的有效方法

java - JUnit:这可以(应该)完成吗?

java - 简单 Intent - jUnit 测试失败

java - 如何使用 css 选择器选择以下值

java - 将 hash_hmac 转换为 android java

java - 如何在运行时在启用 Spring 的 Web 应用程序中安排新方法?

java - 使用 UI.getCurrent().navigate 从另一个类导航时,类中的异步更新不起作用

java - 如何将变量传递给 .property 文件中引用的 JVM?