【问题标题】:How to use Mockito to verify that an error message is logged?如何使用 Mockito 验证是否记录了错误消息?
【发布时间】:2011-05-28 20:44:48
【问题描述】:

我有一个要测试的错误情况。我要验证的行为是错误消息被写入日志。由于 Mockito 不能存根静态方法,这相当困难,因为我希望我的被测类直接写入 System.err.println() 或我的静态 Log.error() 方法。我不想将模拟的“记录器对象”注入每个可能写入错误消息的对象!

所以我想我要问的是,您认为构建我的 Log 类和/或被测类的最佳方式是什么,以便我可以删除日志记录方法或用模拟的方法替换它们记录器?

最好的答案甚至可能不使用 Mockito,它可以是任何东西。我宁愿不导入像 PowerMock 这样的另一个库,但如果你有一个很好的答案需要类似的东西,我不介意看到它。

【问题讨论】:

    标签: java logging mocking mockito


    【解决方案1】:

    如果您想将日志记录逻辑保留在静态方法中,您仍然可以在基于某些系统属性加载类时初始化真正的日志记录实现:

    class Log {
    
      private static MyLogger logger;
    
      static {
        String className = System.getProperty("my.static.logger.class.name");
        // Instantiate your logger here...
        // By default use some DefaultLogger implementation...
      }
    
      public static void error(String message, Throwable t) {
        logger.error(message, t);
      }
    
    }
    

    然后,当您运行测试时,您可以使用 -D 属性指定模拟类名称。但是你需要在没有 mockito 魔法的情况下实现你的 mock logging 类。

    【讨论】:

    • 对,我在想办法注入日志依赖。这种方式还不错,因为如果我愿意,可以在命令行上指定它。但正如你所说,通过反射实例化也意味着我不能注入 Mockito 模拟。
    • 我想如果我想在运行时注入一个 mock,我需要一个 Log.setLogger() 方法。我真的想不出更好的方法来做到这一点。而且我必须公开该方法,因为我的测试不会与Log 类都在同一个包中。嗯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2021-08-11
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    相关资源
    最近更新 更多