2012-08-29 38 views
1

我有一个玩! 2应用程序(Scala),在那里我有一些需要在出现错误时执行日志记录的类。玩游戏的嘲笑记录器! 2框架

我希望能够单元测试这些日志记录操作实际发生在正确的条件下。要做到这一点,我需要能够模拟记录器,但我遇到了Mockito的一些问题。我所(简化)看起来像

import play.api.{ Logger, LoggerLike } 

trait BaseService { 
    val log: LoggerLike 

    def fail(reason: String) { 
    log.error(reason) 
    } 
} 

object Service extends BaseService { 
    val log = Logger 
} 

,然后在测试

import org.specs2.mutable._ 
import org.specs2.mock._ 
import services.BaseService 

object Service extends BaseService with Mockito { 
    val log = mock[play.api.Logger] 

    def verify(key: String) = { 
    there was one(log).error(key) 
    } 
} 

class ServiceSpec extends Specification { 
    "failures should be logged" in { 
    Service.fail("foo") 
    Service.verify("foo") 
    } 
} 

但我得到的错误

[error]  NullPointerException: null (Logger.scala:43) 
[error] play.api.LoggerLike$class.isErrorEnabled(Logger.scala:43) 
[error] play.api.Logger.isErrorEnabled(Logger.scala:147) 
[error] play.api.LoggerLike$class.error(Logger.scala:127) 
[error] play.api.Logger.error(Logger.scala:147) 
[error] services.BaseService$class.fail(Service.scala:19) 
[error] Service$.fail(ServiceSpec.scala:11) 
... 

我尝试添加

log.isErrorEnabled returns true 
log.error(any[String]) returns {} 

但那么甚至是Service fa的初始化ILS。

回答

1

我不是Mockito专家,但我认为你的模拟在这里出现故障,因为堆栈跟踪显示实际播放Logger方法被调用。这可能是因为你试图在这里嘲笑一个Scala object。相反,如果你嘲笑的特质像

val log = mock[play.api.LoggerLike] 

你就会得到过去的这个特定的错误,并到下一个问题 - 您的验证不起作用:

[error] The mock was not called as expected: 
[error] Argument(s) are different! Wanted: 
[error] loggerLike.error(
[error]  ($anonfun$apply$mcV$sp$1) <function0> 
[error]); 
[error] -> at Service$$anonfun$verify$1.apply$mcV$sp(ServiceSpec.scala:10) 
[error] Actual invocation has different arguments: 
[error] loggerLike.error(
[error]  ($anonfun$fail$1) <function0> 
[error]); 
[error] -> at services.BaseService$class.fail(x.scala:57) 
[error] (ServiceSpec.scala:17) 

这是一个事实,即引起日志消息作为名称参数(因此是匿名函数)而不是字符串传递,请参阅this question以进一步讨论。

+0

谢谢,这正是问题!现在还有待澄清如何解决名副其实的问题。您发布的问题中的解决方案看起来有点难看,但希望我能够将其按摩到更清晰的地方。 – Andrea