5

単体テスト中にコンパイルするように見えるが 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)

Akka トレイトの「ログ」オブジェクトをオーバーライドする mixin トレイトを使用するように変更しようとしましたLoggingが、コンパイラはそれを許可しませんでした。コンパイラの応答は、「不注意な間違いを犯してほしくありません」というようなものでした。うーん!その「間違い」が欲しい。

別の方法を知っている人はいますか?私は Mockito に固執しておらず、提案を歓迎します。

4

1 に答える 1

4

Scalamockは、ネイティブの Scala モック フレームワークです (とりわけ、関数のモックが可能です)。ここで完全な例を見つけることができます:

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

おそらくそれはあなたの問題を解決するでしょう。

于 2011-07-20T14:17:16.857 に答える