代码之家  ›  专栏  ›  技术社区  ›  Vinnie

奇怪的JUnit日志行为

  •  4
  • Vinnie  · 技术社区  · 17 年前

    这是一个简单的JUnit测试,演示了我所描述的行为。

    @Test
    public void logMessage() {
        // set up new logger with output directed to standard out
        Logger logger = Logger.getLogger("my.test.logger");
        logger.addHandler(new StreamHandler(System.out, new SimpleFormatter()));
    
        // log a warning message
        logger.warning("logger message"); // message 1
    
        // turn off parent handlers
        logger.setUseParentHandlers(false);
    
        // log a second warning message
        logger.warning("second logger message"); // message 2
    
        // print somehting to standard output
        System.out.println("standard output message");  //message 3
    }
    

    Testsuite: com.my.FormatterTest
    Feb 19, 2009 12:02:33 PM com.my.FormatterTest logMessage
    WARNING: logger message
    standard output message
    Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.079 sec
    
    ------------- Standard Output ---------------
    standard output message
    ------------- ---------------- ---------------
    ------------- Standard Error -----------------
    Feb 19, 2009 12:02:33 PM com.my.FormatterTest logMessage
    WARNING: logger message
    ------------- ---------------- ---------------
    Feb 19, 2009 12:02:33 PM com.my.FormatterTest logMessage
    WARNING: logger message
    Feb 19, 2009 12:02:33 PM com.my.FormatterTest logMessage
    WARNING: second logger message
    test:
    BUILD SUCCESSFUL (total time: 2 seconds)
    

    标准输出 JUnit输出的一部分?

    2 回复  |  直到 17 年前
        1
  •  6
  •   krosenvold    17 年前

    通过查看JunitTestRunner类的源代码,可以很容易地看到这一点。

    编辑: 我看了一些源代码,因为你的问题让我很好奇。我不知道你在用哪个TestRunner,答案可能就在那里;流重定向等不是junit框架的一部分,而是由ant/eclips/maven/idea实现的。它 外表 就像你的addHandler一样,无论如何都没有效果,所以我怀疑有什么东西在拦截它(如果 全部 日志记录由父日志记录器完成)。

        2
  •  5
  •   Community Mohan Dere    8 年前

    krosenvold's comments 让我找到了正确的答案(谢谢!)。

    看起来stdout实际上被重定向到另一个(JUnit)流。然而,真正的问题是StreamHandler的缓冲区直到 之后

    @Test
    public void logMessage() {
        // set up new logger with output directed to standard out
        Logger logger = Logger.getLogger("my.test.logger");
        StreamHandler sh = new StreamHandler(System.out, new SimpleFormatter());
        logger.addHandler(sh);
    
        // log a warning message
        logger.warning("logger message"); // message 1
    
        // turn off parent handlers
        logger.setUseParentHandlers(false);
    
        // log a second warning message
        logger.warning("second logger message"); // message 2
    
        // print somehting to standard output
        System.out.println("standard output message");  //message 3
    
        // FLUSH THE STREAM HANDLER !!!
        sh.flush();
    }
    

    yields

    Testsuite: com.my.FormatterTest
    Feb 20, 2009 12:58:17 PM com.my.FormatterTest logMessage
    WARNING: logger message
    standard output message
    Feb 20, 2009 12:58:17 PM com.my.FormatterTest logMessage
    WARNING: logger message
    Feb 20, 2009 12:58:17 PM com.my.FormatterTest logMessage
    WARNING: second logger message
    Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.078 sec
    
    ------------- Standard Output ---------------
    standard output message
    Feb 20, 2009 12:58:17 PM com.my.FormatterTest logMessage
    WARNING: logger message
    Feb 20, 2009 12:58:17 PM com.my.FormatterTest logMessage
    WARNING: second logger message
    ------------- ---------------- ---------------
    ------------- Standard Error -----------------
    Feb 20, 2009 12:58:17 PM com.my.FormatterTest logMessage
    WARNING: logger message
    ------------- ---------------- ---------------
    test:
    BUILD SUCCESSFUL (total time: 2 seconds)
    time: 2 seconds)