Jaa*_*aap 8 scala mockito playframework
我正在尝试使用Scala中的Play框架进行单元测试.我写了一个类来检查配置是否正确(我有更多的错误处理,但我实际上现在使用此代码进行测试):
class TaskQueueConfig(conf: Configuration) {
val schedulingEnabled = conf.getBoolean("schedulingEnabled").get
val processingEnabled = conf.getBoolean("processingEnabled").get
val queueName = conf.getString("queue").get
}
Run Code Online (Sandbox Code Playgroud)
我正在使用play 2.1.1的默认测试设置来测试它:
class ConfigTestSpec extends Specification with Mockito with CalledMatchers {
"TaskQueueConfig" should {
"verify calls" in {
val tqConf = mock[Configuration]
tqConf.getString("queue") returns Some("queueName")
tqConf.getBoolean("schedulingEnabled") returns Some(true)
tqConf.getBoolean("processingEnabled") returns Some(true)
Logger.error("setup done")
val config = new TaskQueueConfig(tqConf)
there was one(tqConf).getString("queue")
there were two(tqConf).getBoolean(any[String])
there were one(tqConf).getBoolean("schedulingEnabled")
there were one(tqConf).getBoolean("processingEnabled")
}
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
[error] x verify calls
[error] The mock was not called as expected:
[error] configuration.getString$default$2();
[error] Wanted 1 time:
[error] -> at config.ConfigTestSpec$$anonfun$2$$anonfun$apply$4$$anonfun$apply$12.apply(ConfigTestSpec.scala:61)
[error] But was 2 times. Undesired invocation:
[error] -> at config.TaskQueueConfig.<init>(TaskQueueConfig.scala:10) (ConfigTestSpec.scala:61)
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为代码非常孤立,在TaskQueueConfig中显然只有1个conf.getString调用.第10行是带有getString方法的行.第61行是"有一个(tQConf).getString"的行
我该如何解决这个问题?
(和之间没有区别).
PS:我知道这个例子对于测试是没用的,但是我有更复杂的配置,其中有一些需要测试的规则.
更新1
getString方法有两个参数,第二个参数的默认值为None(它的类型是Option [Set [String]]).当我明确地将None添加到设置和验证时,它仍然不起作用.但是当我添加时null,我会让它工作.
val tqConf = mock[Configuration]
tqConf.getString("queue", null) returns Some("queueName")
tqConf.getBoolean("schedulingEnabled") returns Some(true)
tqConf.getBoolean("processingEnabled") returns Some(true)
val c = new TaskQueueConfig(tqConf)
there was one(tqConf).getString("queue", null)
there was one(tqConf).getString(any[String], any[Option[Set[String]]])
there were two(tqConf).getBoolean(any[String])
there was one(tqConf).getBoolean("schedulingEnabled")
there was one(tqConf).getBoolean("processingEnabled")
c.processingEnabled must beTrue
c.schedulingEnabled must beTrue
c.queueName must be("queueName")
Run Code Online (Sandbox Code Playgroud)
所以我想现在的问题是,为什么我必须使用null?
您必须null在双参数getString()调用中使用,因为 Mockito 要求您要么对所有参数使用 use 匹配器,要么根本不使用匹配器。
因此,将"queue"(文字)与any[Option[Set[String]]](匹配器)混合是行不通的。有时Mockito 可以判断出你已经这样做了,它会给你一个错误,但看起来你在这里不走运......
尝试在所有位置使用匹配器,如下所示:
tqConf.getString(org.mockito.Matchers.eq("queue"), any[Option[Set[String]]]) returns Some("queueName")
Run Code Online (Sandbox Code Playgroud)
并验证:
there was one(tqConf).getString(eq("queue"), any[Option[Set[String]]])
Run Code Online (Sandbox Code Playgroud)