Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 游戏中的模拟记录器!2框架_Unit Testing_Scala_Mocking_Playframework 2.0_Mockito - Fatal编程技术网

Unit testing 游戏中的模拟记录器!2框架

Unit testing 游戏中的模拟记录器!2框架,unit-testing,scala,mocking,playframework-2.0,mockito,Unit Testing,Scala,Mocking,Playframework 2.0,Mockito,我有一个剧本!2应用程序(Scala),我有一些类在出现错误时需要执行日志记录 我希望能够单元测试这些日志记录操作是否在正确的条件下实际发生。要做到这一点,我需要能够模拟记录器,但我在Mockito方面遇到了一些问题。我(简化了)的样子 import play.api.{ Logger, LoggerLike } trait BaseService { val log: LoggerLike def fail(reason: String) { log.error(reaso

我有一个剧本!2应用程序(Scala),我有一些类在出现错误时需要执行日志记录

我希望能够单元测试这些日志记录操作是否在正确的条件下实际发生。要做到这一点,我需要能够模拟记录器,但我在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 {}

但是,甚至服务的初始化也失败了。

我不是Mockito专家,但我认为您的mock在这里出现了故障,因为堆栈跟踪显示了正在调用的实际播放
记录器
方法。这可能是因为您试图在此处模拟Scala
对象。如果你取而代之的是嘲笑这种特质

 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)
[错误]未按预期调用模拟:
[错误]参数不同!通缉:
[错误]类似loggerLike.error(
[错误]($anonfun$apply$mcV$sp$1)
[错误];
[错误]->在服务$$anonfun$处验证$1。应用$mcV$sp(ServiceSpec.scala:10)
[错误]实际调用具有不同的参数:
[错误]类似loggerLike.error(
[错误]($anonfun$fail$1)
[错误];
[错误]->at services.BaseService$class.fail(x.scala:57)
[错误](ServiceSpec.scala:17)

这是由于日志消息是以名称参数(以及匿名函数)而不是字符串的形式传递的,请参阅以获取进一步的讨论

我不是Mockito专家,但我认为您的mock在这里出现了故障,因为堆栈跟踪显示了实际调用的play
Logger
方法。这可能是因为您试图在此处模拟Scala
对象。如果你取而代之的是嘲笑这种特质

 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)
[错误]未按预期调用模拟:
[错误]参数不同!通缉:
[错误]类似loggerLike.error(
[错误]($anonfun$apply$mcV$sp$1)
[错误];
[错误]->在服务$$anonfun$处验证$1。应用$mcV$sp(ServiceSpec.scala:10)
[错误]实际调用具有不同的参数:
[错误]类似loggerLike.error(
[错误]($anonfun$fail$1)
[错误];
[错误]->at services.BaseService$class.fail(x.scala:57)
[错误](ServiceSpec.scala:17)

这是由于日志消息是以名称参数(以及匿名函数)而不是字符串的形式传递的,请参阅以获取进一步的讨论

谢谢,这正是问题所在!现在,如何绕过“按名称传递”还有待澄清。你发布的问题中的解决方案看起来有点难看,但希望我能把它推敲得更清楚。谢谢你,这正是问题所在!现在,如何绕过“按名称传递”还有待澄清。你发布的问题中的解决方案看起来有点难看,但希望我能把它推敲得更清楚一些。