Mockito scala验证测试不起作用(播放框架)



我正在尝试在scala中使用Play框架进行单元测试。我写了一个类来检查配置是否正确(我有更多的错误处理,但我现在实际上将此代码用于我的测试):

class TaskQueueConfig(conf: Configuration) {
  val schedulingEnabled = conf.getBoolean("schedulingEnabled").get
  val processingEnabled = conf.getBoolean("processingEnabled").get
  val queueName = conf.getString("queue").get
}

我正在使用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")
    }
  }
}

我收到以下错误:

[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)

这很奇怪,因为代码非常隔离,在 TaskQueueConfig 中显然只有 1 个 conf.getString 调用。第 10 行是带有 getString 方法的行。第 61 行是带有"有一个(tQConf).getString"的行

如何解决此问题?

(曾经和曾经之间没有区别)。

PS:我知道这个例子对测试毫无用处,但我有更复杂的配置,其中有一些规则需要测试。

更新 1getString 方法有两个参数,第二个参数的默认值为 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")

所以我想现在的问题是,为什么我必须使用 null?

您必须

在双参数getString()调用中使用null,因为 Mockito 要求您对所有参数使用匹配器或根本不使用匹配器。

因此,将"queue"(文字)与any[Option[Set[String]]](匹配器)混合是行不通的。有时Mockito可以计算出你已经这样做了,它给了你一个错误,但看起来你在这里很不走运......

尝试在所有位置使用匹配器,如下所示:

tqConf.getString(org.mockito.Matchers.eq("queue"), any[Option[Set[String]]]) returns Some("queueName")

并验证:

there was one(tqConf).getString(eq("queue"), any[Option[Set[String]]])

相关内容

  • 没有找到相关文章

最新更新