如何在Mockito Scala中模拟任意块



所以我有以下代码

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
  }
}

其中日志度量是某种副作用(例如,将指标上传到CloudWatch(。

现在我正在这样做

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

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

现在我必须固定OP。

所以我的存根如下: -

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

我的固执就像

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

显然我的固执是错误的,但是我无法弄清楚如何适当地固执。

Mockito不支持这一点,因为by-name参数这是一个不存在于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 Suite的一部分

相关内容

  • 没有找到相关文章

最新更新