如何使用JUnit套件通过@before拦截测试

时间:2019-04-16 12:30:35

标签: java unit-testing spring-boot junit4

我想运行现有测试两次,一次将日志级别设置为TRACE,一次将日志级别设置为ERROR。为此,我尝试使用测试套件并添加了一个用@Before注释的方法。

代码本身是用Spring Boot编写的,默认记录器配置为Log level TRACE,因此正常的测试执行是使用Log level TRACE,这对于第一次运行很有用。

对于套件的运行(其中第二次配置了所有测试),我希望在执行每个测试之前调用带有注释的@Before方法,但不是。

我唯一看到的效果是,当我调用@BeforeClass时,它被调用了一次。由于每个测试都会从头开始启动spring上下文,因此我重写的Log级别仅在执行的第一个测试中使用。

这是我的测试套件,您有什么想法要实现?

@RunWith(ParallelSuite.class)
@SuiteClasses("**/*Test.class")
@Log4j2
public class TestSuiteWithErrorLogger {

@BeforeClass
public static void beforeClass() {
    Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
    Logger controller = (Logger) LoggerFactory.getLogger("komposit.guidewire.controller");
    root.setLevel(Level.ERROR);
    controller.setLevel(Level.ERROR);
    log.error("set logging to warn so that all tests will be called without log statements");
}

@Before
public void before() {
    Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
    Logger controller = (Logger) LoggerFactory.getLogger("komposit.guidewire.controller");
    root.setLevel(Level.ERROR);
    controller.setLevel(Level.ERROR);
    log.error("set logging to warn before every test in this suite");
}

@ClassRule
public static ExternalResource testRule = new ExternalResource() {
    @Override
    protected void before() throws Throwable {
        Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
        Logger controller = (Logger) LoggerFactory.getLogger("komposit.guidewire.controller");
        root.setLevel(Level.ERROR);
        controller.setLevel(Level.ERROR);
        log.error("set logging to error with a custom rule");
    };

    @Override
    protected void after() {
        log.error("after finishing a test logging is still on error");
    };
};
}

0 个答案:

没有答案