在Actors外部登录Akka TestKit

时间:2016-08-08 15:18:29

标签: scala logging akka

我一直在尝试在scalaTest中记录内容:

class ChangeSetActorTest extends PersistenceSpec(ActorSystem("Persistent-test-System")) with
     

PersistenceCleanup {

  val log = Logging(system, this)

基本上我们只是说ChansetActorTest继承自TestKit(系统)

不幸的是

  

Logging(system, this)

无法使用此

我收到以下错误:

  

[错误]   /Users/maatary/Dev/IdeaProjects/PoolpartyConnector/src/test/scala/org/iadb/poolpartyconnector/changepropagation/ChangeSetActorTest.scala:22:   找不到LogSource   org.iadb.poolpartyconnector.changepropagation.ChangeSetActorTest   请参阅ScalaDoc for LogSource,了解如何获取或构建一个。   [error] val log = Logging(system,this)

我在Akka Logging Doc中相信这是以下几点: 在所有其他情况下,除非隐式LogSource [T]在相关类型的范围内,否则会发生编译错误。

换句话说,没有LogSource [TestKit]

我想要最简单的解决方案来处理这个问题,只需要很少的额外配置。到目前为止,我所做的是以下内容,一切都按预期工作:

class ChangeSetActorTest extends PersistenceSpec(ActorSystem("Persistent-test-System")) with
     

PersistenceCleanup {

      val log = system.log

从那里开始,我就去做

之类的事情
val received = chgtFetcher.receiveWhile((requestInterval + ProcessingLag).*(3)) {
  case msg:FetchNewChangeSet => log.info(s"received: ${msg}" ) ; chgtFetcher.reply(NoAvailableChangeSet); msg
}

我的问题,这是推荐的appraoch。到目前为止,来自我的演员和来自测试的消息的顺序是有序的。

请云你告诉我推荐的appraoch登录统一的appraoch:

1 - 从Test类(例如上面)和Actor同时进行?

2 - 如果使用外部类需要记录的系统,我们需要进行一次统一记录(异步)。

非常感谢

-M -

2 个答案:

答案 0 :(得分:0)

看一下这个评论: https://github.com/akka/akka/blob/master/akka-actor/src/main/scala/akka/event/Logging.scala#L196-L237

我认为更直接的方法是在本地定义implicit LogSource[ChangeSetActorTest]

即:

val log = {
  implicit val logSource = new LogSource[ChangeSetActorTest] {
    override def genString(t: ChangeSetActorTest) = "ChangeSetActorTest"
  }
  Logging(system, this)
}

答案 1 :(得分:0)

登录TestKit的最简单方法是:

  1. 从底层Actor获取记录器:

    val mockActor = TestActorRef(new XXXActor)
    val log = mockActor.underlyingActor.log
    
  2. 使用FeatureSpecLike

http://doc.scalatest.org/3.0.1-2.12/org/scalatest/FeatureSpecLike.html

class ChangeSetActorTest extends PersistenceSpec(ActorSystem("Persistent-test-System")) with PersistenceCleanup with FeatureSpecLike {

//...
alert("Something like warning")
info("Infos")
note("Green infos")
markup("documents")

}