Модульный тест LazyLogging с использованием Mockito - PullRequest
0 голосов
/ 25 октября 2019

У меня есть класс, который расширяет черту LazyLogging

class TaskProcessor()
  extends Processor
    with LazyLogging {

  def a1() = {
    logger.info("Test logging")
  }
}

Теперь я хочу проверить, работает ли моя регистрация. Поэтому я последовал этому примеру Сообщения регистратора модульных тестов, используя specs2 + scalalogging и написал свой тест следующим образом

 "TaskProcessor" should "test logging" in {

    val mockLogger = mock[Logger]
    val testable = new TaskProcessor {
      override val logger: Logger = mockLogger
    }
    verify(mockLogger).info("Test logging")
}

Я получаю следующую ошибку

Error:(32, 20) overriding lazy value logger in trait LazyLogging of type com.typesafe.scalalogging.Logger;
 value logger must be declared lazy to override a concrete lazy value
      override val logger: Logger = mockLogger

Чтобы устранитьПри этом я изменяю оператор

  override val logger: Logger = mockLogger

на

  override lazy val logger: Logger = mockLogger

Я получаю следующую ошибку

Cannot mock/spy class com.typesafe.scalalogging.Logger
Mockito cannot mock/spy following:
  - final classes
  - anonymous classes
  - primitive types
org.mockito.exceptions.base.MockitoException: 
Cannot mock/spy class com.typesafe.scalalogging.Logger
Mockito cannot mock/spy following:
  - final classes
  - anonymous classes
  - primitive types
    at org.scalatest.mockito.MockitoSugar.mock(MockitoSugar.scala:73)
    at org.scalatest.mockito.MockitoSugar.mock$(MockitoSugar.scala:72)

Мои зависимости следующие:

 "org.scalatest" %% "scalatest" % "3.0.5" % "test",
  "org.mockito" % "mockito-all" % "1.10.19" % Test,
  "com.typesafe.scala-logging" %% "scala-logging" % "3.9.2",

Может кто-нибудь подсказать мне, как я могу издеваться над регистратором и проводить тестирование.

1 Ответ

0 голосов
/ 26 октября 2019

Проблема в том, что класс com.typesafe.scalalogging.Logger не может быть смоделирован, потому что он окончательный, но мы все еще можем смоделировать базовый org.slf4j.Logger.

import org.scalatest.mockito.MockitoSugar
import org.slf4j.{Logger => UnderlyingLogger}
import com.typesafe.scalalogging.Logger
import org.scalatest.{Matchers, WordSpec, FlatSpec}
import org.mockito.Mockito._

class TaskProcessorSpec extends FlatSpec with Matchers with MockitoSugar {

  "TaskProcessor" should "test logging" in {

    val mockLogger = mock[UnderlyingLogger]
    when(mockLogger.isInfoEnabled).thenReturn(true)

    val testable = new TaskProcessor {
      override lazy val logger = Logger(mockLogger)
    }
    testable.a1()

    verify(mockLogger).info("Test logging")
  }
}
...