返回

使用 Kotlin 和 RxJava 测试 MVP 架构的完整示例 - 第 3 部分

Android

简介

这是 Android 测试系列的最后一部分。如果你错过了前 2 个部分,不用担心,即使你没有阅读过,也可以理解这一点。如果你真的想看看,你可以从 这里 找到它们。

在这部分中,您将学习如何使用假数据在 Espresso 中创建 UI 测试,如何模拟 Mockito-Kotlin 的依赖关系,以及如何将两者结合起来以编写 MVP 架构的完整端到端测试。

使用 Espresso 创建 UI 测试

Espresso 是一个用于 Android UI 测试的开源框架。它使编写可靠且可维护的 UI 测试变得非常容易。

要开始使用 Espresso,您需要在 build.gradle 文件中添加以下依赖项:

testImplementation 'androidx.test.espresso:espresso-core:3.4.0'

接下来,您需要创建一个测试类来编写 UI 测试。此类应扩展 ActivityInstrumentationTestCase2 类并传递要测试的活动类作为构造函数参数。例如:

class MainActivityTest : ActivityInstrumentationTestCase2<MainActivity>(MainActivity::class.java) {
}

现在,您可以编写 UI 测试了。Espresso 提供了许多方法来与 UI 交互和断言其状态。例如,您可以使用以下方法来点击按钮:

onView(withId(R.id.my_button)).perform(click())

您还可以使用以下方法来断言文本视图的文本:

onView(withId(R.id.my_text_view)).check(matches(withText("Hello world!")))

有关 Espresso 的更多详细信息,请参阅官方文档。

使用 Mockito-Kotlin 模拟依赖关系

Mockito-Kotlin 是一个用于 Kotlin 的 Mockito 框架。它允许您模拟对象并验证它们的方法调用。

要开始使用 Mockito-Kotlin,您需要在 build.gradle 文件中添加以下依赖项:

testImplementation 'org.mockito:mockito-kotlin:4.0.0'

接下来,您可以使用 mock() 方法来模拟一个对象:

val mockObject = mock<MyObject>()

您可以使用 whenever()thenReturn() 方法来模拟方法调用:

whenever(mockObject.doSomething()).thenReturn("Hello world!")

您还可以使用 verify() 方法来验证方法调用:

verify(mockObject).doSomething()

有关 Mockito-Kotlin 的更多详细信息,请参阅官方文档。

将 Espresso 和 Mockito-Kotlin 结合使用

现在您已经了解了 Espresso 和 Mockito-Kotlin 的基础知识,让我们将它们结合起来以编写 MVP 架构的完整端到端测试。

首先,您需要创建一个测试用例类来编写测试。此类应扩展 ActivityInstrumentationTestCase2 类并传递要测试的活动类作为构造函数参数。例如:

class MainActivityTest : ActivityInstrumentationTestCase2<MainActivity>(MainActivity::class.java) {
}

接下来,您需要模拟 Presenter 的依赖关系。为此,您可以在测试用例类的 setUp() 方法中使用以下代码:

@Before
fun setUp() {
    val mockPresenter = mock<MainPresenter>()
    val mainActivity = activity
    mainActivity.presenter = mockPresenter
}

现在,您可以使用 Espresso 和 Mockito-Kotlin 来编写 UI 测试。例如,您可以编写以下测试来验证当用户单击按钮时,Presenter 的 doSomething() 方法会被调用:

@Test
fun testClickButton() {
    onView(withId(R.id.my_button)).perform(click())

    verify(activity.presenter).doSomething()
}

您还可以编写以下测试来验证当 Presenter 的 doSomething() 方法被调用时,文本视图的文本会更新:

@Test
fun testUpdateTextView() {
    whenever(activity.presenter.doSomething()).thenReturn("Hello world!")

    onView(withId(R.id.my_text_view)).check(matches(withText("Hello world!")))
}

这些只是您可以使用 Espresso 和 Mockito-Kotlin 编写的 UI 测试的几个示例。有关更多详细信息,请参阅官方文档。

结论

在本文中,您学习了如何使用假数据在 Espresso 中创建 UI 测试,如何模拟 Mockito-Kotlin 的依赖关系,以及如何将两者结合起来以编写 MVP 架构的完整端到端测试。

我希望这篇文章对您有所帮助。如果您有任何问题,请随时发表评论。