4

作为测试的一部分,我使用 EventFilter 和 TestEventListener 来监听日志消息。但是,这样做会导致我的命令提示符中出现大量洪水......这使得我很难看到我的测试正在发生。

示例代码:

it("should send a welcome message to the user", SystemFortressTest) {
  val stub = new SubFortressBuildingPermitRefTraitImplStub
  EventFilter.debug(message = "SystemFortressExchange: Received Message: SystemOutput(List(JITMP Booted))", occurrences = 1) intercept {
      stub.buildASubFortress(SystemFortressBlueprintRef)
  }
}

这段代码有效,但它用调试级别的数据淹没了我,因为 TestEventListener 默认打印到 STDOUT(因为它子类化了默认记录器,它只是直接的 STDOUT 记录)

我可以滚动我自己的日志抽象,它位于 Akka 的顶部,并在它到达 Akka 的东西之前从那里过滤消息......所以它不会污染我的命令提示符......但是如果有一个非常大惊小怪类似的解决方案已经可用。

问题是,如果我使用 SL4J Logger,它不适用于 EventFilter。

4

3 回答 3

4

我要做的是:

akka.loglevel = DEBUG
akka.loggers = ["akka.event.slf4j.Slf4jLogger", "akka.testkit.TestEventListener"]

..然后在我的测试中:

system.eventStream.publish(Mute(EventFilter.info()))
system.eventStream.publish(Mute(EventFilter.debug()))

这边走:

  • 错误和警告被报告两次(但无论如何都应该修复:))
  • 调试和信息消息仅通过 slf4j 报告
  • 您仍然可以使用事件过滤器来检查特定消息(可能在先取消静音之后)

请注意,通常我认为测试日志消息是一种代码气味 - 通常最好检查更多“可观察”的行为。也许将事件发布到事件流。

于 2014-07-30T11:16:16.720 回答
0

您可以配置日志级别或与其他记录器一样完全关闭记录器。因此,当您配置 TestEventListener 时,您可以按如下方式指定日志记录。

akka.loggers=["akka.testkit.TestEventListener"]
akka.loglevel = OFF

希望这可以帮助

于 2013-11-10T12:52:32.357 回答
0

一种解决方案是创建一个新的侦听器类,该类扩展TestEventListener并覆盖该print方法以不执行任何操作,或者通过您首选的日志记录解决方案进行记录,而不是直接打印到标准输出。然后,您可以application.confakka.loggers选项下将自定义事件侦听器指定为记录器。(详见https://doc.akka.io/docs/akka/2.5/scala/testing.html

所以你的事件监听器将是:

package mypackage
import akka.testkit.TestEventListener

class SilentTestEventListener extends TestEventListener {
  override def print(event: Any): Unit = ()
}

您可以将以下内容添加到application.conf

akka {
  loggers = [mypackage.SilentTestEventListener]
}

如果您通过更改日志级别来关闭日志记录,或者使用事件过滤器过滤嘈杂的日志,那么您也将无法在测试中收听这些日志,因为这也是通过事件过滤器完成的:记录器仅对日志执行过滤器,直到找到第一个过滤掉日志消息的过滤器。如果它在测试中使用的过滤器之前找到另一个这样的过滤器,那么您的测试将永远不会收到有关日志条目的通知。

另一个更好的解决方案是实现一个事件监听器,它定义了自己的日志处理方式,而不是继承和修改的行为StdOutLogger(因为你会期望一个子类StdOutLogger记录到标准输出......),但这需要更多比上面的 hacky 解决方案更努力,因为您必须复制TestEventListener.

于 2017-10-13T13:48:24.073 回答