按照指南here,我已将 @FailTestOnLeak 添加到我的测试中,并将 FailAnnotatedTestOnLeakRunListener 添加为侦听器,一切似乎都按预期工作,发现泄漏,并且我已跟踪 FailTestOnLeakRunListener 以正确执行其 failTest ()例行公事,但我的问题是测试没有失败(但通过)。深入挖掘一下,看起来实际上尝试触发测试失败的底层代码是通过instrumentation.sendStatus(-2, ...)(here)。我已经确认此代码可以执行,但我的测试仍然通过。知道为什么我的测试可能无法正确失败吗?
非常感谢!
在 LeakCanary 的新版本(在
2.14
上测试)中,他们删除了 @FailTestOnLeak
注释和 FailAnnotatedTestOnLeakRunListener
支持。
所以剩下的选项是创建一个自己的测试规则,以复制行为
class FailOnLeakTestRule : TestRule {
override fun apply(base: Statement, description: Description): Statement {
return object : Statement() {
override fun evaluate() {
AppWatcher.objectWatcher.clearWatchedObjects()
base.evaluate()
val leaks = AppWatcher.objectWatcher.retainedObjects
if (leaks.isNotEmpty()) {
throw AssertionError("Memory leaks detected: $leaks")
}
AppWatcher.objectWatcher.clearWatchedObjects()
}
}
}
}
并在测试类中声明它:
@get:Rule
internal val failOnLeakRule = FailOnLeakRule()
但是和以前一样,观察者应该安装在被测试的代码中才能使其工作,就像
override fun onDestroyView(view: View) {
Timber.d("onDestroyView, view is $view")
AppWatcher.objectWatcher.expectWeaklyReachable(
watchedObject = view,
description = "TestView received onDestroyView() callback"
)
super.onDestroyView(view)
}