使用Mockito进行单元测试LazyLogging

时间:2019-10-25 18:49:30

标签: scala logging mockito scalatest

我正在上课,扩展了LazyLogging特性

class TaskProcessor()
  extends Processor
    with LazyLogging {

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

现在,我想测试我的日志记录是否有效。因此,我遵循了这个示例Unit test logger messages using 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 :(得分:1)

问题在于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")
  }
}
相关问题