在测试一段代码时,我们通常有断言来检查是否设置了变量,是否执行了代码块等,但我们通常不测试是否将正确的日志消息保存到日志文件中。
我的环境是Java, Spring, Mockito和Logback。我正在考虑使用Mockito并注入日志作为数据源。我环顾四周,找不到一个更好的主意。
您是否知道使用现有的Logback .xml文件测试Logback的现有系统,该系统也支持MDC?
在这个特定的系统上,我们有两个记录器。其中一个记录器记录正常事件,例如"输入方法A","执行了某些操作","退出方法A"。
另一个日志用于审计。例如,它存储传入和传出特定模块的参数。这个日志中有一些报告(使用MDC),因此所使用的标记和标记的值很重要,我们想要验证MDC标记是否包含参数的值。但是,正如我所说的,这些值应该只到审计日志,而不是到"正常"日志,所以,除了测试值到审计日志之外,我们想测试它们没有到其他日志。
听起来你做的不是诊断日志记录,而是应用程序事件日志记录。
如果是诊断日志…停下来,你不需要测试它。这就像对断言进行单元测试或对单元测试进行单元测试。
如果它的应用程序事件日志记录,你只是真正的单元测试,那么你应该只做一个protected
助手方法,实际调用记录器。然后在单元测试中,您只需扩展被测类并子类化helper方法,以设置测试在被调用后读取的变量(没有特殊的mock库或可怕的反射)。或者,如果你想创建更多的工作,你可以创建一个助手组件,一个接口,为你做事件日志,并模仿它。
如果你真的想检查日志的输出,那么我认为你应该完全进行集成测试,甚至可以用自定义的logback.xml创建一个单独的项目。此外,集成测试将是全面测试MDC的唯一方法,因为它是基于线程本地的,天知道其他组件将绑定到它。
我的意思是,就Spring而言,集成测试是加载你的大部分应用程序(即你将实际使用的ApplicationContext XML或Java Configuration),而不使用任何mock。幸运的是,Spring在这方面帮助很大。