Как макетировать произвольные блоки кода в Mockito Scala? - PullRequest
0 голосов
/ 25 апреля 2018

Итак, у меня есть следующий бит кода

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 голосов
/ 27 августа 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...