首页 > 解决方案 > 如何使用 Mockk 测试 Intent 的 Bundle?

问题描述

我想测试一个自定义处理程序类,它正在启动一个新的Activity. 我想测试Intent's Bundleif 是否包含预定义的参数。

测试类

@MockK
lateinit var activity: ActivityCalendar

@Before
fun setUp() {
    MockKAnnotations.init(this)
}

@Test
fun testActivityBundles() {
    val book = mockk<Book>()

    every { book.releaseDate } returns GregorianCalendar().apply { this.timeInMillis = 1423825586000 }
    every { activity.startActivity(any()) } just Runs

    val handler = ActivityHandler(activity)
    handler.startRequiredActivity(book)

    verify { activity.startActivity(
            withArg { intent ->
                val bundle = intent.extras!!
                val releaseDateTimeMillis = bundle.getLong("release_date", 0L)

                Assert.assertEquals(1423825586000, releaseDateTimeMillis)
            }
    ) }
}

上面的代码在线崩溃:val bundle = intent.extras!!但它不应该。

我要测试的课程

class ActivityHandler(val activity: Activity) {
    fun startRequiredActivity(book: Book) {
        val intent = buildIntent(book)

        activity.startActivity(intent)
    }

    private fun buildIntent(book: Book): Intent {
        val extras = Bundle().apply {
            this.putLong("release_Date", book.releaseDate.timeInMillis)
        }

        return Intent(activity, ActivityBookDetails::class.java).apply {
            putExtras(extras)
        }
    }
}

data class Book(
        val releaseDate: GregorianCalendar
)

我调试了代码,发现该函数private fun buildIntent(book: Book): Intent返回一个“null”对象(字符串“null”而不是 Java NULL)。

标签: androidunit-testingmockk

解决方案


推荐阅读