使用 PowerMockRunner 测试 LiveData

Testing LiveData using PowerMockRunner

我的本地单元测试一直使用 LiveData。通常,当您尝试在 MutableLiveData 上设置一个值时,您会得到

java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked.

因为本地 JVM 无法访问 Android 框架。我用它解决了这个问题:

@get:Rule
val rule = InstantTaskExecutorRule()

一切都很好,直到我不得不使用 PowerMockito 模拟 google 播放库中的静态方法。因为我添加了

@RunWith(PowerMockRunner::class)
@PrepareForTest(Tasks::class)

在我的测试 class 声明之上,我开始再次收到此 Looper not mocked 错误。我之前在 MockitoJUnitRunner 中使用过这条规则,一切都很好。

不用担心,事实证明您仍然可以使用此方法来测试您的 LiveData 观察者!

首先,在模块的 build.gradle 文件中添加此依赖项:

testImplementation 'android.arch.core:core-testing:1.0.0-alpha3'

确保您使用与其余 android.arch.* 依赖项相同的版本!

然后,在测试class需要调用setValue()和断言的地方,添加这个字段:

@Rule
public TestRule rule = new InstantTaskExecutorRule();

对于 Kotlin

@get:Rule
var rule: TestRule = InstantTaskExecutorRule()

在幕后,这会绕过主线程检查,并立即在您的测试线程上运行任何任务,从而允许立即和可预测的调用以及断言。

已有此答案here

回答有点晚了,但遇到同样的问题并解决了!

要使用 PowerMockInstantTaskExecutorRule 您需要添加以下注释:

@RunWith(PowerMockRunner::class)
@PowerMockRunnerDelegate(MockitoJUnitRunner::class) //this line allows you to use the powermock runner and mockito runner
@PrepareForTest(UnderTestClass::class)
class UnderTestClassTest {

    @get:Rule
    var instantExecutorRule = InstantTaskExecutorRule()