LeakCanary FailAnnotatedTestOnLeakRunListener/@FailTestOnLeak 没有让我的仪器测试失败

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

按照指南here,我已将 @FailTestOnLeak 添加到我的测试中,并将 FailAnnotatedTestOnLeakRunListener 添加为侦听器,一切似乎都按预期工作,发现泄漏,并且我已跟踪 FailTestOnLeakRunListener 以正确执行其 failTest ()例行公事,但我的问题是测试没有失败(但通过)。深入挖掘一下,看起来实际上尝试触发测试失败的底层代码是通过instrumentation.sendStatus(-2, ...)(here)。我已经确认此代码可以执行,但我的测试仍然通过。知道为什么我的测试可能无法正确失败吗?

非常感谢!

android android-instrumentation leakcanary
1个回答
0
投票

在 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)
}
© www.soinside.com 2019 - 2024. All rights reserved.