如何使log4j error()调用在jUnit测试中引发异常?

请:

我有一个正在使用JUnit(Junit 3和Junit 4样式的混合)测试的Java项目,其中被测类可能会记录log4j错误。如果记录了这样的错误,我想使单元测试失败。

是否有一种通用的方法来配置log4j或单元测试基础结构以对被测代码中的log4j error()方法进行任何调用都会引发运行时异常,从而使测试失败?AOP可能是一种方法,但我也对其他可能性感兴趣。

这里的目的是清除代码中错误使用log4j error()的位置。也就是说,当记录错误但没有发生异常或错误处理时,它不是真正的错误,还是应该并且应该引发。

例如:

public class MyTest extends TestCase {
    public void testLogAnError() {
        // Want to make this fail
        new MyClass().logAnError();
    }
}

public class MyClass() {
    static Logger logger = Logger.getLogger("foo");

    public void logAnError() {
        // I'm logging an error, but not doing anything about it
        logger.error("Something bad, or is it?");
        // TODO throw an exception or don't log an error if there isn't one
    }
}

更新:这就是我目前使用的解决方案。它基于sbridges的答案(添加到测试类中):

private static final Appender crashAndBurnAppender = new NullAppender () {
    public void doAppend(LoggingEvent event) {
         if(event.getLevel() == Level.ERROR) {
              throw new AssertionError("logged at error:" + event.getMessage());
         }
    }
};

然后在setUp中:

Logger.getRootLogger().addAppender(crashAndBurnAppender);

和拆解:

Logger.getRootLogger().removeAppender(crashAndBurnAppender);
bridge

您可以创建一个新的Appender,当您以错误级别登录时,该Appender会引发AssertionError。

就像是,

class TestAppender extends AppenderSkeleton {
    public void doAppend(LoggingEvent event) {
         if(event.getLevel() == Level.Error) {
              throw new AssertionError("logged at error:" + event.getMessage());
         }
    }
}

在测试中

Logger.getRootLogger().addAppender(new TestAppender());

编辑:正如Ralph所指出的,请在完成测试后删除TestAppender。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章