Android Kotlin 检测测试是否在调用 finish() 开始另一个 Activity 后结束/完成一个 Activity

标签 android kotlin android-activity instrumented-test

我正在使用 Kotlin 开发 Android 应用。我正在我的项目中添加仪器测试。现在,我正在努力测试在启动另一个 Activity 后是否未打开一个 Activity 。这是我的场景。

我有启动 LoginActivity 的 MainActivity。

这是MainActivity的代码

class MainActivity : AppCompatActivity() {

    companion object {
        val LAUNCH_DELAY: Long = 2000
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Handler().postDelayed({
            this.startLoginActivity()
            finish() //please, pay attention here
        }, LAUNCH_DELAY)
    }

    protected fun startLoginActivity()
    {
        startActivity(Intent(this, LoginActivity::class.java))
    }
}

正如您在上面的代码中看到的,我在启动 LoginActivity 后调用 finish() 方法来终止 Activity 。我想测试是否在主 Activity 启动的登录 Activity 中按下后退按钮,应用程序关闭并且不会返回到主 Activity 。

这是我的测试课

@RunWith(AndroidJUnit4::class)
class MainActivityTest {
    @Rule @JvmField
    val mainActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule<MainActivity>(MainActivity::class.java)
    @Rule @JvmField
    val loginActivityRule: ActivityTestRule<LoginActivity> = ActivityTestRule<LoginActivity>(LoginActivity::class.java)

    @Before
    fun setUp() {
    }

    @Test
    fun mainActivityHistoryIsForgottenAfterStartingLoginActivity()
    {
        Intents.init()
        Thread.sleep(MainActivity.LAUNCH_DELAY);
        Intents.release()

        pressBack()
        //here how can I assert if the main activity is not open.
    }
}

请注意代码中的注释。我想断言主 Activity 是否未打开,或者当在登录 Activity 中按下后退按钮时它不会返回主 Activity 。我该如何测试它?

最佳答案

由于您想要测试与您的应用程序的高级交互,您应该使用 UI Automator test framework .

首先将库添加到build.gradle:

dependencies {
    ...
    androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
}

然后像这样写一个测试:

@RunWith(AndroidJUnit4::class)
class MainActivityTest {
    @get:Rule
    val mainActivityRule = ActivityTestRule(MainActivity::class.java)

    @Test
    fun mainActivityHistoryIsForgottenAfterStartingLoginActivity()
    {
        // mainActivityRule makes sure MainActivity is launched, so we just need to wait
        // for MainActivity to launch LoginActivity
        Thread.sleep(MainActivity.LAUNCH_DELAY)

        // Wait some more since the system is not instantaneous
        Thread.sleep(1000)

        // Now LoginActivity should be showing. Press the back button
        val uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
        uiDevice.pressBack()

        // Wait some more still since the system is not instantaneous
        Thread.sleep(1000)

        // Make sure that we have left our app, i.e. pressing back have closed our app
        // BuildConfig.APPLICATION_ID is the package name of our app
        // So if the currently active package (app) is NOT our own app, it means
        // our own app was closed, which is what we want to test.
        assertNotEquals(uiDevice.currentPackageName, BuildConfig.APPLICATION_ID)
    }
}

注意你不应该有这个:

@Rule @JvmField
val loginActivityRule: ActivityTestRule<LoginActivity> = ActivityTestRule<LoginActivity>(LoginActivity::class.java)

因为这将在测试开始时启动 LoginActivity。你不想要那个。您希望 MainActivity 启动 LoginActivity。另请注意,您可以简化

@Rule @JvmField
val mainActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule<MainActivity>(MainActivity::class.java)

@get:Rule
val mainActivityRule = ActivityTestRule(MainActivity::class.java)

你不需要任何东西

@Before
fun setUp() {
}

因为它是空的,什么也不做。

关于Android Kotlin 检测测试是否在调用 finish() 开始另一个 Activity 后结束/完成一个 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58148750/

相关文章:

带有 RxKotlinFX 堆栈的 Kotlin 给出 Cannot access class 错误

android:screenOrientation=”locked” 在旧操作系统版本上

android - 开始 Activity 时崩溃

android - Git on Windows 7 for Android in Eclipse : How do I use version-control on existing project?

Android Kotlin - 无法解析 Firebase

Android Studio 模拟器首次出现互联网连接问题

java - 从 Android 启动不同的任务

android - 如何在屏幕底部添加工具栏?

android - 拍照后相机一直处于拍照模式

android - 我的 android 应用程序中有两个 Activity 。在我的第二个 Activity 中,我有一个按钮可以截取之前 Activity 的屏幕截图