如何测试和验证Timber日志是否被执行?

问题描述 投票:0回答:1

我有一个有 Timber 日志调用的函数。所以我需要在测试中验证该日志是否被调用了

Timber.tag("MyGag").d("My message $parameter")

有没有办法验证这个日志是否被执行了?

android unit-testing junit junit4 robolectric
1个回答
0
投票

您可以通过几种方式验证:

这篇文章中描述的一个很好的解决方案是创建一个“间谍”木材树,如下所示:

首先,我们创建一个

TestTree
保存并允许查询日志。 (最好在
test
源目录中创建此类以避免在产品中访问它):

import timber.log.Timber

class TestTree : Timber.Tree() {
  val logs = mutableListOf<Log>()

  override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
    logs.add(Log(priority, tag, message, t))
  }

  data class Log(val priority: Int, val tag: String?, val message: String, val t: Throwable?)
}

然后,在我们的测试类中,我们将那棵树“种植”到 Timber 中,并直接对

testTree
执行任何断言:

fun test() {
  val testTree = TestTree()
  Timber.plant(testTree)
  
  subjectUnderTest.invoke()

  val actual = testTree.logs.last()
  val expected = TestTree.Log(
      priority = Log.ERROR,
      message = "expected logged message",
      tag = "expcted logged tag,
      t = ExpectedException()
  )
  assertEquals(expected, actual)

}

您会发现很多其他方法(即使可能不是最好的方法,也在上面的文章中讨论过)是使用一个常用的模拟库来模拟对

Timber
对象的调用。这看起来像这样(假设 mockk 作为模拟库,对于带有 PowerMock 的 mockito 等也是有效的)

fun test() {
  // We're mocking statically, which is suboptimal
  mockStatic(Timber::class)
  
  sut.invoke()

  verify { Timber.d("Expected log message") }
}
© www.soinside.com 2019 - 2024. All rights reserved.