Я пробовал несколько вещей, которые, кажется, компилируются, но выдают исключения 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)
Я попытался изменить его, чтобы использовать некоторую миксин-черту, которая переопределяла объект «log» черты Akka Logging
, но компилятор не позволял это. Ответ компилятора был чем-то вроде «мы не хотим, чтобы вы сделали непреднамеренную ошибку». Тьфу! Я хочу эту «ошибку».
Кто-нибудь знает другой способ? Я не привязан к Мокито и приветствую любые предложения.