【问题标题】:Using Mokito to mock out an Akka Actor's log object使用 Mockito 模拟 Akka Actor 日志对象
【发布时间】:2011-10-09 10:03:47
【问题描述】:

我尝试了一些似乎可以编译但在单元测试期间抛出 NullPointer 异常的方法,所以我想知道如何才能克服单元测试中的限制。我有一个看起来像这样的类:

class LogWriter extends Actor{
  def receive{
    case x:Timing => log.info(x toString)
    case x:Event => log.info(x toString)
    case x:Any => log.warning("Improper message sent to LogWriter, %s".format(x toString))
  }
}

但尝试使用 Specs2 和 Mockito 支持进行单元测试,类似以下内容:

class LogWriterSpec extends Mokito with Specification{
  val mockedLog = mock[Logger]

  class MockedLogWriter extends LogWriter{
    @transient override val log = mockedLog
  }

  val writer = actorOf(new MockedLogWriter).start

  def testTiming = {
    val message = Timing("testTiming", 15 seconds)
    writer !! (message, 400)
    there was one(mockedLog).info(message toString)
  }

  def is = "A LogWriter" ^
    "should write a Timing message to log.info" ! testTiming ^
  end
}

同时编译结果为上述NullPointerException:

[akka:event-driven:dispatcher:global-10] ERROR akka.actor.Actor$ - Problem
java.lang.NullPointerException
    at akka.util.Logger.warning_$qmark(Logging.scala:43)
    at akka.util.Logger.warning(Logging.scala:117)

我尝试将其更改为使用一些 mixin 特征,该特征覆盖了 Akka Logging 特征的“日志”对象,但编译器不允许这样做。编译器的回答类似于“我们不希望你犯一个无意的错误”。啊!我想要那个“错误”。

有人知道另一种方法吗?我不拘泥于 Mockito,欢迎任何建议。

【问题讨论】:

    标签: unit-testing scala mockito akka actor


    【解决方案1】:

    Scalamock 是一个原生的 Scala 模拟框架(其中,它允许模拟函数)。你可以在这里找到一个完整的例子:

    http://www.paulbutcher.com/2011/11/scalamock-step-by-step/

    也许它会解决你的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      • 1970-01-01
      相关资源
      最近更新 更多