在运行任何测试之前,Spring或JUnit运行器是否有可用于运行代码的东西?
我找到的最接近的是@Rule
和@ClassRule
,它们在班级上工作。
我有一个Docker @ClassRule
,它为空集成测试提供一个空数据库。使用@ClassRule
,它每次都会重新启动容器。
我宁愿在启动测试时启动它一次(无论是所有测试还是只测试一次),运行测试,然后杀死容器。
我已经四处寻找,但除了阶级规则之外我还没有找到任何其他东西。如果我遗漏了一些明显的东西,请道歉。答案 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)
也许您正在寻找的是那两个注释:
@Before
在每次测试之前运行,而@BeforeClass
只运行一次
你可以像这样使用它:
@Before
public void setUp(){
// start container here
}
您还有等同于后测:@After
@AfterClass
您会找到一个很好的解释here
由于