gpt4 book ai didi

junit - 如何包装 JUnit 5 测试

转载 作者:行者123 更新时间:2023-12-03 19:35:20 26 4
gpt4 key购买 nike

在 JUnit 4 中,您可以使用规则来包装测试,以便您可以在测试运行之前和之后执行代码。在大多数情况下,这可以通过 @Before 和 @After 方法或 ExternalResource 规则来完成。然而,一些控制流结构(如 try-with-resources)不能分成两种方法。在大多数情况下,这些构造有替代方案,允许您将它们拆分为两种方法。例如,使用 try-with-resources,您可以手动获取和关闭资源,而不是使用 try 块。

我遇到的具体问题是我使用的数据库库 jOOQ 只有采用回调的事务方法。 (请参阅 https://www.jooq.org/doc/latest/manual/sql-execution/transaction-management/ )您不能调用以下内容:

context.startTransaction()
doStuff()
context.commit() // Or rollback()

在 JUnit4 中,这是可以的,因为您可以编写这样的规则(在 Kotlin 中,但在 Java 中等效):
class TransactionRule(private val dbSessionManager: DBSessionManager) : TestRule {
override fun apply(base: Statement, description: Description): Statement {
return object : Statement() {
override fun evaluate() {
dbSessionManager.transaction {
base.evaluate()

}
}
}
}
}

JUnit 5 中有类似的东西吗?

最佳答案

你可以写一个 InvocationInterceptor代替 JUnit4 规则:

public class TransactionInvocationInterceptor implements InvocationInterceptor {

@Override
public void interceptTestMethod(Invocation<Void> invocation,
ReflectiveInvocationContext<Method> invocationContext,
ExtensionContext extensionContext) throws Throwable {
runInTransaction(() -> {
try {
invocation.proceed();
} catch (Throwable t) {
throw new RuntimeException(t);
}
});
}
}

@ExtendWith(TransactionInvocationInterceptor.class)
class InvocationInterceptorTest {

@Test
void test() {

}
}

一个区别是 interceptTestMethod只包装测试方法,不包装其他生命周期方法,如 beforeEach .可以使用 InvocationInterceptor 中的其他方法单独拦截其他生命周期方法。 ,但不能一次多次调用(例如,如果您想在一个事务中同时调用 beforeEach 和测试方法)。

关于junit - 如何包装 JUnit 5 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50167184/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com