0

我是整个生态系统的新手,包括Scala,AkkaScalaTest

我正在解决我Actor调用外部系统的问题。

case object LogProcessRequest

class LProcessor extends Actor {
  val log = Logging(context.system, this)

  def receive = {
    case LogProcessRequest =>
      log.debug("starting log processing")
      LogReaderDisruptor main(Array())
  }
}

LogReaderDisruptor main(Array())是一个Java可以做很多其他事情的类。

我目前的测试看起来像

class LProcessorSpec extends UnitTestSpec("testSystem") {

  "A mocked log processor" should {
    "be called" in  {
      val logProcessorActor = system.actorOf(Props[LProcessor])
      logProcessorActor ! LogProcessRequest
    }
  }
}

UnitTestSpec看起来像哪里(并从这里获得灵感)

import akka.actor.ActorSystem
import akka.testkit.{ImplicitSender, TestKit}
import org.scalatest.matchers.MustMatchers
import org.scalatest.{BeforeAndAfterAll, WordSpecLike}

abstract class UnitTestSpec(name: String)
  extends TestKit(ActorSystem(name))
  with WordSpecLike
  with MustMatchers
  with BeforeAndAfterAll
  with ImplicitSender {

  override def afterAll() {
    system.shutdown()
  }
}

问题

  • 如何模拟调用LogReaderDisruptor main(Array())并验证它是否被调用?

我来自Java, JUnit,Mockito土地,我会在这里做的事情是

doNothing().when(logReaderDisruptor).main(Matchers.<String>anyVararg())
verify(logReaderDisruptor, times(1)).main(Matchers.<String>anyVararg())

我不确定如何在这里用 ScalaTest 翻译它。

另外,这段代码可能不是惯用的,因为我很新并且正在学习

4

1 回答 1

0

有几种方法可以做到这一点。那种OO方式就是把logDisrupter包装成一个对象传进去。我会设置一个伴生对象来实例化actor。像下面的东西。然后你可以通过替代实现。您还可以通过使用特征并仅根据需要在替代 logDisrupter 中混合来实现类似的方法。

object LProcessor {
   def props(logDisrupter : LogDisrupter) = Props(new LProcessor(logDisrupter))
}

class LProcessor(logDisrupter : LogDisrupter) extends Actor {
  val log = Logging(context.system, this)

  def receive = {
    case LogProcessRequest =>
      log.debug("starting log processing")
      logDisrupter.doSomething();
  }
}

然后实例化为

val logProcessorActor = system.actorOf(LProcessor.props(logDisrupter))
于 2015-05-26T23:48:26.440 回答