临时文件夹现在有了@TempDir
. ExternalResource
但是,一般来说,s背后的想法呢?也许它是用于模拟数据库、模拟 HTTP 连接或您想要添加支持的其他一些自定义资源?
答案是,你可以使用@RegisterExtension
注释来实现非常相似的东西。
使用示例:
/**
* This is my resource shared across all tests
*/
@RegisterExtension
static final MyResourceExtension MY_RESOURCE = new MyResourceExtension();
/**
* This is my per test resource
*/
@RegisterExtension
final MyResourceExtension myResource = new MyResourceExtension();
@Test
void test() {
MY_RESOURCE.doStuff();
myResource.doStuff();
}
这是基本的脚手架MyResourceExtension
:
public class MyResourceExtension implements BeforeAllCallback, AfterAllCallback,
BeforeEachCallback, AfterEachCallback {
private SomeResource someResource;
private int referenceCount;
@Override
public void beforeAll(ExtensionContext context) throws Exception {
beforeEach(context);
}
@Override
public void afterAll(ExtensionContext context) throws Exception {
afterEach(context);
}
@Override
public void beforeEach(ExtensionContext context) throws Exception {
if (++referenceCount == 1) {
// Do stuff in preparation
this.someResource = ...;
}
}
@Override
public void afterEach(ExtensionContext context) throws Exception {
if (--referenceCount == 0) {
// Do stuff to clean up
this.someResource.close();
this.someResource = null;
}
}
public void doStuff() {
return this.someResource.fooBar();
}
}
你当然可以将这一切包装为一个抽象类,并MyResourceExtension
实现只是protected void before()
和protected void after()
或一些这样的,如果那是你的事,但为了简洁起见,我省略了。