whe*_*ies 5 unit-testing scala mockito actor akka
我已经尝试了一些似乎可以编译但在单元测试期间抛出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))
}
}
Run Code Online (Sandbox Code Playgroud)
但是尝试使用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
}
Run Code Online (Sandbox Code Playgroud)
在编译前面提到的结果时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)
Run Code Online (Sandbox Code Playgroud)
我尝试改变它以使用一些mixin特性,它覆盖了Akka Logging特性的"log"对象,但编译器不允许它.编译器的回复类似于"我们不希望你犯下无意的错误".啊! 我想要那个"错误".
有人知道另一种方式吗?我不会坚持Mockito并欢迎任何建议.
Scalamock是一个原生的 Scala 模拟框架(除其他外,它允许模拟函数)。您可以在这里找到完整的示例:
http://www.paulbutcher.com/2011/11/scalamock-step-by-step/
也许它会解决你的问题。