我想在不使用@Law的情况下在JUNIT 5中转换这段代码。我尝试了JUINT 5 TestWatcher,但它没有启动方法。尝试了这个,但无法理解如何实现扩展或扩展
@Rule
public TestWatcher watchman = new TestWatcher() {
@Override
public void starting(final Description description) {
logger.info("STARTING test: " + description.getMethodName());
}
};
有关JUnit 5的更多信息,我建议阅读JUnit 5用户指南。
在JUnit 5中,如果您想在每次测试之前执行一个方法,那么您可以使用@Before每
注释。要获取有关要执行的测试的信息,您可以为方法提供一个TestInfo
参数,该参数将自动为您注入。例如:
import java.lang.reflect.Method;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;
// import logger...
class XXXTests {
final Logger logger = ...;
@BeforeEach
void logStartOfTest(TestInfo info) {
logger.info("STARTING test: " + info.getMethod().map(Method::getName).orElse(null));
}
@Test
void testFoo() {
// perform assertions
}
}
如果您不想为每个测试都编写它,那么您可以创建自己的扩展来实现BeforeEachCallback
。例如:
import java.lang.reflect.Method;
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
// import logger..
public class MyExtension implements BeforeEachCallback {
final Logger logger = ...;
@Override
public void beforeEach(ExtensionContext context) {
logger.info("STARTING test: " + context.getTestMethod().map(Method::getName).orElse(null));
}
}
然后应用您的扩展:
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(MyExtension.class)
class XXXTests {
@Test
void testFoo() {
// perform assertions
}
}
你的扩展类可以实现多个扩展接口。如果你想观察成功和失败,那么你也可以实现org. junit.jupiter.api.扩展.TestWatcher
,但是请注意,接口在JUnit 5.7中才变得稳定API(我相信它是在5.4版中添加的)。
JUnit 5对一个名为TestWatcher
的接口有自己的定义——参见用户指南——但它没有一个与JUnit 4的start
方法等效的方法。相反,您在JUnit 4中的start
方法中拥有的内容可以进入JUnit 5的@Before每一个
方法,对于其余的方法(例如那些处理测试成功和失败的方法),您可以实现这个接口并覆盖它的方法(例如test成功
和testFail
),然后使用带有@ExentBy注释的扩展类,如下所示:
@ExtendWith(MyTestWatcher.class)
class MyTestClass {
...
}