我有一个有 Timber 日志调用的函数。所以我需要在测试中验证该日志是否被调用了
Timber.tag("MyGag").d("My message $parameter")
有没有办法验证这个日志是否被执行了?
您可以通过几种方式验证:
这篇文章中描述的一个很好的解决方案是创建一个“间谍”木材树,如下所示:
首先,我们创建一个
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") }
}