【问题标题】:Testing LiveData using PowerMockRunner使用 PowerMockRunner 测试 LiveData
【发布时间】:2019-01-24 06:56:00
【问题描述】:

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

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

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

@get:Rule
val rule = InstantTaskExecutorRule()

一切都很好,直到我不得不使用 PowerMockito 来模拟来自 google play 库的静态方法。自从我添加了

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

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

【问题讨论】:

标签: android kotlin powermockito android-livedata


【解决方案1】:

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

要使用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()

【讨论】:

  • 我不会这么想的。谢谢!
  • 哟。你是一个救生员。
  • 示例在 Kotlin 中,您遇到的错误是什么
  • 您的解决方案添加了以下行。 @PowerMockRunnerDelegate(MockitoJUnitRunner::class) //这行允许你使用powermock runner和mockito runner Made it work all
【解决方案2】:

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

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

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

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

然后,在需要调用setValue() 并断言的测试类中,添加此字段:

@Rule
public TestRule rule = new InstantTaskExecutorRule();

对于 Kotlin

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

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

已经有这个答案here

【讨论】:

  • 我已经使用了这个规则。问题是因为我使用 PowerMockRunner 这个规则没有效果。我又开始得到这个例外,好像我根本不会使用这个规则。只要我使用常规的 MockitoJUnitRunner,它就可以正常工作,但在这个测试中我需要使用那个。
猜你喜欢
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
相关资源
最近更新 更多