如何将规则应用于 AndroidJUnitRunner 中的所有测试用例?

问题描述

我正在尝试将 TestWatcher 作为规则应用于由特定运行程序运行的所有测试用例。

元数据收集器:

class MetadataCollector : TestWatcher() { ... }

TestRunner:

class TestRunner : AndroidJUnitRunner() {

  override fun onCreate(arguments: Bundle?) {
    super.onCreate(arguments)
  }

  override fun newApplication(cl: ClassLoader?,className: String?,context: Context?): Application {
    return super.newApplication(cl,TestApplication::class.java.name,context)
  }
}

我的所有测试类目前都需要将 MetadataCollector() 初始化为规则:

测试类:

@JvmField @Rule val collector = MetadataCollector()

有没有办法可以为运行程序的每个测试用例自动创建此规则的实例?理想情况下,这是为了避免在每个测试类中重复创建 @Rule

不幸的是,我目前坚持使用 JUnit 4。 :(

解决方法

有一种更好的方法可以做到这一点,即向您的测试运行程序中注入一个 RunListener 实例。在您的 gradle 配置中,您需要:

defaultConfig.testInstrumentationRunner = "com.mypackage.MyTestRunnerClassName"
defaultConfig.testInstrumentationRunnerArgument("listener","com.mypackage.MyRunListenerClassName")

并在代码中创建一个RunListenerClassName来实现对应的钩子

class MyRunListener : RunListener() { 
   // impl
}