如何在Mockito Scala中模拟任意代码块?

时间:2018-04-25 02:16:47

标签: scala mockito

所以我有以下代码

class MetricsLogger {

  def measure[T](name:String)(operation: => T): T = {
      val startTime = System.currentTimeMillis
      val result = try {
        operation
       } finally {
        logMetric(Metric(name, System.currentTimeMillis - startTime, StandardUnit.Milliseconds))
      }
      result
  }
}

其中log Metric是某种副作用(例如,将指标上传到cloudwatch)。

现在我这样做

def measuredOp = measure("metricName") { someOperation }

这里有一些操作正在进行一些网络调用。

现在我必须存根测量操作。

所以我的存根如下: -

val loggingMetrics = mock[MetricsLogger] // mock is from MockitoSugar trait

和我的存根就像

 Mockito.when(loggingMetrics.measure(Matchers.anyString())(Matchers.anyObject())).thenReturn(???)

显然我的存根是错误的,但我无法弄清楚如何正确存根。

1 个答案:

答案 0 :(得分:0)

Mockito不支持将其作为副名称参数,这是Java中不存在的概念,但是mockito-scala确实从0.4.0版本开始支持(尝试0.4.0或0.4.2,忽略0.4.1)

我只是像这样进行快速测试

import org.mockito.{ MockitoSugar, ArgumentMatchersSugar }

class StackOverflowTest extends WordSpec with MockitoSugar with scalatest.Matchers with ArgumentMatchersSugar {

  "mock[T]" should {

    "it should work with by-name params" in {
      val loggingMetrics = mock[MetricsLogger]

      when(loggingMetrics.measure(any)(any)).thenReturn("it worked!")

      loggingMetrics.measure("test")("") shouldBe "it worked!"
    }
  }
}

免责声明:我是该库的维护者,尽管它是Mockito官方套件的一部分