使用 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。
回答有点晚了,但遇到同样的问题并解决了!
要使用 PowerMock
和 InstantTaskExecutorRule
您需要添加以下注释:
@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()
我的本地单元测试一直使用 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。
回答有点晚了,但遇到同样的问题并解决了!
要使用 PowerMock
和 InstantTaskExecutorRule
您需要添加以下注释:
@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()