【问题标题】:Looper.getMainLooper() null on unit testLooper.getMainLooper() 在单元测试中为空
【发布时间】:2021-05-31 14:21:10
【问题描述】:

我正在尝试对从视图扩展的类进行单元测试,但由于在父类中的某个时刻,它正在尝试使用实际上为空的Looper.getMainLooper().thread,因此我得到了一个空指针异常。在试图理解为什么视图初始化失败并抛出 NPE 之后,我注意到这似乎是因为 Looper.getMainLooper()。我应该如何为检查主循环器的视图编写单元测试,以及在 MockitoJUnitRunner 上执行的测试在哪里执行?

代码示例:

@RunWith(MockitoJUnitRunner::class)

  @Test
  fun `my test`(){

      val looper = Looper.getMainLooper()
      val myView = MycustomView(x,y,z)
  }

【问题讨论】:

  • 有什么想法吗?
  • 如果视图变得更难测试,那么考虑一下它是否做得太多可能是个好主意。这听起来像是控制器/演示者/其他东西应该做的事情,然后您可以在自己创建时将 Looper 注入该对象。

标签: android unit-testing kotlin junit mockito


【解决方案1】:

您需要使用静态模拟。 MockK 非常适合这一点,可以与 Mockito 一起使用。

您可以通过这种方式使用 MockK 从静态 getMainLooper() 方法中存根 thread:

mockkStatic(Looper::class)

val looper = mockk<Looper> {
    every { thread } returns Thread.currentThread()
}

every { Looper.getMainLooper() } returns looper

// run your tests

unmockkAll()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 2014-08-15
    • 1970-01-01
    • 2020-08-31
    • 2019-01-22
    • 1970-01-01
    相关资源
    最近更新 更多