提问者:小点点

如何在JUNIT5中替换@规则


我想在不使用@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());
        }
    };

共2个答案

匿名用户

有关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 {
    ...
}