以下是我如何实现它,通过使用Spring bean在我的数据库中设置一些测试数据,通过将上面的Sam的答案与此答案相结合:https://stackoverflow.com/a/51556718/278800dataSource
import javax.sql.DataSource;
import org.junit.jupiter.api.extension.BeforeAllCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.junit.jupiter.SpringExtension;
public class TestDataSetup implements BeforeAllCallback, ExtensionContext.Store.CloseableResource {
private static boolean started = false;
private DataSource dataSource;
@Override
public void beforeAll(ExtensionContext extensionContext) {
synchronized (TestDataSetup.class) {
if (!started) {
started = true;
// get the dataSource bean from the spring context
ApplicationContext springContext = SpringExtension.getApplicationContext(extensionContext);
this.dataSource = springContext.getBean(DataSource.class);
// TODO: put your one-time db initialization code here
// register a callback hook for when the root test context is shut down
extensionContext
.getRoot()
.getStore(ExtensionContext.Namespace.GLOBAL)
.put("TestDataSetup-started", this);
}
}
}
@Override
public void close() {
synchronized (TestDataSetup.class) {
// TODO: put your db cleanup code here
}
}
(我不是100%确定线程的安全性,所以我只是为了安全起见而添加了块。synchronized
要启用此扩展,您只需将此注释添加到需要它的测试类中:
@ExtendWith(TestDataSetup.class)
好消息是 Junit 5 允许多个扩展,因此即使您的测试已经用 .@ExtendWith(SpringExtension.class)