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

时间:2018-01-08 16:43:43

标签: java spring junit

在运行任何测试之前,Spring或JUnit运行器是否有可用于运行代码的东西?

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

我有一个Docker @ClassRule,它为空集成测试提供一个空数据库。使用@ClassRule,它每次都会重新启动容器。

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

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

2 个答案:

答案 0 :(得分: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()函数,因为它们在每个类之前和之后。如果你想在类之间做一些事情,你可以在那里添加东西。

答案 1 :(得分:0)

也许您正在寻找的是那两个注释:

@BeforeClass

@Before

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

你可以像这样使用它:

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

您还有等同于后测:@After @AfterClass

您会找到一个很好的解释here

由于