Junit 如何在每个JVM中运行jul-to-slf4j桥一次?

Junit 如何在每个JVM中运行jul-to-slf4j桥一次?,junit,testng,slf4j,surefire,Junit,Testng,Slf4j,Surefire,我希望以并行模式(多个JVM)运行Surefire,其中每个JVM必须运行: SLF4JBridgeHandler.removeHandlersForRootLogger(); SLF4JBridgeHandler.install(); 就在第一次测试之前。如何做到这一点?在测试套件的开头运行一些代码有多种方法 这里有4个(我相信还有更多): JUnit via和(根据中的示例改编): @RunWith(Suite.class) @SuiteClass({FirstTest.class,Sec

我希望以并行模式(多个JVM)运行Surefire,其中每个JVM必须运行:

SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();

就在第一次测试之前。如何做到这一点?

在测试套件的开头运行一些代码有多种方法

这里有4个(我相信还有更多):

  • JUnit via和(根据中的示例改编):

    @RunWith(Suite.class)
    @SuiteClass({FirstTest.class,SecondTest.class/*,…*/,LastTest.class})
    公共静态类AllWithLF4JBridgeHandler{
    @课前
    公共静态无效注册表RotLoggerHandlers(){
    SLF4JBridgeHandler.removeHandlersFrrootLogger();
    SLF4JBridgeHandler.install();
    }
    }
    
  • 使用以下工具进行测试:

    /**
    *每个测试类的基类(即每个测试类都应该扩展这个类)。
    */
    公共抽象类基类测试{
    @套房前
    公共无效注册表RotLoggerHandlers(){
    SLF4JBridgeHandler.removeHandlersFrrootLogger();
    SLF4JBridgeHandler.install();
    }
    }
    
  • 使用以下工具进行测试:

    /**
    *测试模块。每个测试类都应该用“@Guice(TestModule.class)”注释。
    */
    公共类TestModule实现该模块{
    @凌驾
    公用作废配置(活页夹){
    SLF4JBridgeHandler.removeHandlersFrrootLogger();
    SLF4JBridgeHandler.install();
    }
    }
    
  • (独立于测试框架):

    /**
    *每个测试类的基类(即每个测试类都应该扩展这个类)。
    */
    公共抽象类基类测试{
    静止的{
    SLF4JBridgeHandler.removeHandlersFrrootLogger();
    SLF4JBridgeHandler.install();
    }
    }
    
  • 我不确定所有这些方法如何与Surefire的并行模式一起工作。方法1和2可能在那里不起作用,但我认为方法3和4应该起作用


    另一种选择是不使用
    SLF4JBridgeHandler
    的编程安装,而是使用java.util.logging.config文件或类(请参阅):

  • “java.util.logging.config.file”:

    logging.properties文件:

    //将SLF4JBridgeHandler注册为j.u.l.根记录器的处理程序
    handlers=org.slf4j.bridge.SLF4JBridgeHandler
    
    系统属性分配:

    java-Djava.util.logging.config.file=/path/to/logging.properties。。。
    
    如果您事先知道日志文件的路径,这将非常有效

  • “java.util.logging.config.class”:

    如果您正在部署WAR,并且不知道文件将位于何处,那么使用文件可能不是一个好选项。因此,您也可以创建一个日志配置类:

    公共类SLF4JBridgeHandlerInitializer{
    公共SLF4JBridgeHandlerInitializer()引发IOException{
    String loggingConfigurationString=“handlers=“+SLF4JBridgeHandler.class.getName();
    InputStream InputStream=new ByteArrayInputStream(loggingConfigurationString.getBytes());
    LogManager.getLogManager().readConfiguration(inputStream);
    }
    }
    
    系统属性分配:

    java-Djava.util.logging.config.class=package.slf4jbridgehandler初始值设定项。。。
    
    我以前做过这件事,对我来说效果很好()


  • 最后两个选项应该初始化每个JVM实例,只要设置了适当的系统属性。

    感谢您的全面回答。