当前位置: 首页 > 面试题库 >

如何用junit测试log4j记录了警告?

鲁丰
2023-03-14
问题内容

我正在测试一种在出现问题时记录警告并返回null的方法。
就像是:

private static final Logger log = Logger.getLogger(Clazz.class.getName());
....
if (file == null || !file.exists()) {
  // if File not found
  log.warn("File not found: "+file.toString());
} else if (!file.canWrite()) {
  // if file is read only
  log.warn("File is read-only: "+file.toString());
} else {
  // all checks passed, can return an working file.
  return file;
}
return null;

我想用junit测试在所有情况下都返回警告,除了返回null外(例如,未找到文件,文件是只读的)。
有任何想法吗?
谢谢,asaf :-)

更新

我对亚伦回答的实现(加上彼得的评论):

public class UnitTest {
...

@BeforeClass
public static void setUpOnce() {
  appenders = new Vector<Appender>(2);
  // 1. just a printout appender:
  appenders.add(new ConsoleAppender(new PatternLayout("%d [%t] %-5p %c - %m%n")));
  // 2. the appender to test against:
  writer = new StringWriter();
  appenders.add(new WriterAppender(new PatternLayout("%p, %m%n"),writer));
}

@Before
public void setUp() {
  // Unit Under Test:
  unit = new TestUnit();
  // setting test appenders:
  for (Appender appender : appenders) {
    TestUnit.log.addAppender(appender);
  }
  // saving additivity and turning it off:
  additivity = TestUnit.log.getAdditivity();
  TestUnit.log.setAdditivity(false);
}

@After
public void tearDown() {
  unit = null;
  for (Appender appender : appenders) {
    TestUnit.log.removeAppender(appender);
  }
  TestUnit.log.setAdditivity(additivity);
}

@Test
public void testGetFile() {
  // start fresh:
  File file;
  writer.getBuffer().setLength(0);

  // 1. test null file:
  System.out.println(" 1. test null file.");
  file = unit.getFile(null);
  assertNull(file);
  assertTrue(writer.toString(), writer.toString().startsWith("WARN, File not found"));
  writer.getBuffer().setLength(0);

  // 2. test empty file:
  System.out.println(" 2. test empty file.");
  file = unit.getFile("");
  assertNull(file);
  assertTrue(writer.toString(), writer.toString().startsWith("WARN, File not found"));
  writer.getBuffer().setLength(0);
}

多谢你们,


问题答案:

在单元测试的设置中:

  1. 获取相同的记录器
  2. 使其非可加性
  3. 添加一个可记住列表中消息的附加程序:

    public class TestAppender extends AppenderSkeleton {
    public List<String> messages = new ArrayList<String>();
    
    public void doAppend(LoggingEvent event) {
        messages.add( event.getMessage().toString() );
    }
    

    }

  4. 将追加器添加到记录器

现在您可以调用您的代码了。测试后,您将在列表中找到所有日志消息。如果需要,添加日志级别(messages.add( event.getLevel() + " " + event.getMessage() );)。

在中tearDown(),再次删除附加程序并启用可加性。



 类似资料:
  • 在Struts 2应用程序中,我们使用log4j进行日志记录。我只想记录警告,但当我尝试在log4j.properties中使用时 它也打印错误和致命日志。我只想要警告日志。我在一些教程中阅读了日志的级别。所以我知道为什么错误和致命打印,因为它们的优先级低于警告。如何仅在我的控制台中打印警告日志? 我的 Java 代码: 任何帮助都将不胜感激!

  • 问题内容: 如何用jenkins用于向我们提供报告的junit xml语法标记易碎的测试?詹金斯(Jenkins)为我提供了一份成功和失败的测试报告。我想知道哪些测试是片状的。 问题答案: 当然,必须避免并修复片状测试。测试应始终通过,如果不是,则需要进行测试。 但是,我们并不是生活在一个完美的世界中,因此,识别不时失败的测试可能会有所帮助。 由于Jenkins跟踪测试结果,因此您可以逐步浏览特定

  • 问题内容: 是否可以通过JUnit测试用例以某种方式拦截日志记录(SLF4J + logback)并获取(或其他可读的信息)…? 问题答案: 您可以创建自定义附加程序 并配置logback-test.xml以使用它。现在我们可以检查测试中的日志记录事件:

  • 我下载了kafka-clients-0.9.0.0。jar与maven一起使用,我希望我会看到类似于Kafka日志链接中的日志记录 然而,我不知道为什么我没有得到任何日志记录,即使我设置了引导。purpuse上的服务器错误,但它只是在没有发出任何警告的情况下被卡住了。我添加了几行代码以使用log4j打印到一个文件中,这似乎是可行的,但不知道为什么Kafka不能将事件记录到log4j中。 请注意,s

  • 我尝试使用第二个日志文件与我的默认日志文件在servlet我有这个log4j.xml配置。 现在在servlet中,我将记录器设置为: 但在运行时:错误日志。调试(“启动应用程序”);我得到: log4j和log4j.xml在类路径我做错了什么?

  • 我有一个方法调用另一个方法来检索数据并将其插入数据库,既然这个方法什么也不检索,我如何在Junit中测试这个方法呢?有人能给我提供一些这种情况的例子吗? 我想为用户使用mock对象,但我不确定如何检查用户是否插入到数据库中。请帮帮忙。