如何将参数传递给 JUnit5 中的扩展 class 构造函数
How to pass argument to extension class constructor in JUnit5
我在将参数从测试 class 传递到其扩展 class 构造函数时遇到问题。
从 JUnit4 迁移到 JUnit5 期间出现问题。 (对于 JUnit4 工作正常)
在 JUnit4 测试中 class 看起来像:
public class TestClass{
@Rule
@Autowired
public SupportClass supportClass;
}
和支持 class 看过:
@Component
@RequiredArgsConstructor
public class SupportClass implements TestRule {
private final EntityManager entityManager;
@Override
public Statement apply(Statement base, Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
final Statistics statistics = ((Session) entityManager.getDelegate()).getSessionFactory().getStatistics();
statistics.clear();
base.evaluate();
}
};
}
}
在 JUnit5 中我正在尝试做(测试 class):
@ExtendWith(SupportClass.class)
public class TestClass{
@Autowired
public SupportClass supportClass;
}
并支持 class 外观:
@Component
@RequiredArgsConstructor
public class SupportClass implements AfterEachCallback, BeforeEachCallback {
private final EntityManager entityManager;
@Override
public void beforeEach(ExtensionContext extensionContext) throws Exception {
final Statistics statistics = ((Session) entityManager.getDelegate()).getSessionFactory().getStatistics();
statistics.clear();
}
@Override
public void afterEach(ExtensionContext extensionContext) throws Exception {
final Statistics statistics = ((Session) entityManager.getDelegate()).getSessionFactory().getStatistics();
statistics.clear();
}
}
当我尝试执行测试时,我得到
java.lang.NoSuchMethodException: .SupportClass.init() 异常。我知道这与缺少非参数构造函数有关。不幸的是,我的 SupportClass 需要这个参数才能工作。问题是如何将此 entityManager 从测试 class 传递到支持作为参数?
这是草图。未检查编译错误、未导入且可能未检查所有详细信息:
@SpringBootTest
public class TestClass{
@Autowired
@RegisterExtension
SupportClass support;
@Test
void myTest() {...}
}
public class SupportClass implements AfterEachCallback, BeforeEachCallback {
private final EntityManager entityManager;
SupportClass(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Override
public void beforeEach(ExtensionContext extensionContext) throws Exception {
final Statistics statistics = ((Session) entityManager.getDelegate()).getSessionFactory().getStatistics();
statistics.clear();
}
@Override
public void afterEach(ExtensionContext extensionContext) throws Exception {
final Statistics statistics = ((Session) entityManager.getDelegate()).getSessionFactory().getStatistics();
statistics.clear();
}
}
我认为SupportClass
不是一个好名字,但那是另一回事。
我在将参数从测试 class 传递到其扩展 class 构造函数时遇到问题。 从 JUnit4 迁移到 JUnit5 期间出现问题。 (对于 JUnit4 工作正常) 在 JUnit4 测试中 class 看起来像:
public class TestClass{
@Rule
@Autowired
public SupportClass supportClass;
}
和支持 class 看过:
@Component
@RequiredArgsConstructor
public class SupportClass implements TestRule {
private final EntityManager entityManager;
@Override
public Statement apply(Statement base, Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
final Statistics statistics = ((Session) entityManager.getDelegate()).getSessionFactory().getStatistics();
statistics.clear();
base.evaluate();
}
};
}
}
在 JUnit5 中我正在尝试做(测试 class):
@ExtendWith(SupportClass.class)
public class TestClass{
@Autowired
public SupportClass supportClass;
}
并支持 class 外观:
@Component
@RequiredArgsConstructor
public class SupportClass implements AfterEachCallback, BeforeEachCallback {
private final EntityManager entityManager;
@Override
public void beforeEach(ExtensionContext extensionContext) throws Exception {
final Statistics statistics = ((Session) entityManager.getDelegate()).getSessionFactory().getStatistics();
statistics.clear();
}
@Override
public void afterEach(ExtensionContext extensionContext) throws Exception {
final Statistics statistics = ((Session) entityManager.getDelegate()).getSessionFactory().getStatistics();
statistics.clear();
}
}
当我尝试执行测试时,我得到 java.lang.NoSuchMethodException: .SupportClass.init() 异常。我知道这与缺少非参数构造函数有关。不幸的是,我的 SupportClass 需要这个参数才能工作。问题是如何将此 entityManager 从测试 class 传递到支持作为参数?
这是草图。未检查编译错误、未导入且可能未检查所有详细信息:
@SpringBootTest
public class TestClass{
@Autowired
@RegisterExtension
SupportClass support;
@Test
void myTest() {...}
}
public class SupportClass implements AfterEachCallback, BeforeEachCallback {
private final EntityManager entityManager;
SupportClass(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Override
public void beforeEach(ExtensionContext extensionContext) throws Exception {
final Statistics statistics = ((Session) entityManager.getDelegate()).getSessionFactory().getStatistics();
statistics.clear();
}
@Override
public void afterEach(ExtensionContext extensionContext) throws Exception {
final Statistics statistics = ((Session) entityManager.getDelegate()).getSessionFactory().getStatistics();
statistics.clear();
}
}
我认为SupportClass
不是一个好名字,但那是另一回事。