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

Rog*_*Rog 7 java junit log4j

我有一个Java项目正在使用JUnit(Junit 3和4样式的混合)进行测试,其中被测试的类可能会记录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
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:这就是我目前使用的解决方案.它基于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());
         }
    }
};
Run Code Online (Sandbox Code Playgroud)

然后在setUp中:

Logger.getRootLogger().addAppender(crashAndBurnAppender);
Run Code Online (Sandbox Code Playgroud)

泪滴:

Logger.getRootLogger().removeAppender(crashAndBurnAppender);
Run Code Online (Sandbox Code Playgroud)

sbr*_*ges 14

您可以创建一个新的Appender,当您在错误级别登录时会抛出AssertionError.

就像是,

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

在你的测试中,

Logger.getRootLogger().addAppender(new TestAppender());
Run Code Online (Sandbox Code Playgroud)

编辑:正如拉尔夫指出的那样,在完成测试后删除TestAppender.

  • 你需要在测试后撤消`Logger.getRootLogger().addAppender(new TestAppender());` 因为Logger是静态的,所以如果没有删除,这个appender也会在下一个测试中预先发布! - 您必须在`@ After`方法或finally语句中执行此操作,因为在异常后将不会执行测试中的"正常"代码. (2认同)