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/