Android Kotlin插装测试在调用finish()启动另一个活动后是否结束/完成一个活动

Android Kotlin插装测试在调用finish()启动另一个活动后是否结束/完成一个活动,android,kotlin,android-activity,instrumented-test,Android,Kotlin,Android Activity,Instrumented Test,我正在使用Kotlin开发一个Android应用程序。我正在我的项目中添加检测测试。现在,我正在努力测试一个活动是否在启动另一个活动后未打开。这是我的设想 我有一个启动后勤活动的主要活动 这是主要活动的代码 class MainActivity : AppCompatActivity() { companion object { val LAUNCH_DELAY: Long = 2000 } override fun onCreate(savedIns

我正在使用Kotlin开发一个Android应用程序。我正在我的项目中添加检测测试。现在,我正在努力测试一个活动是否在启动另一个活动后未打开。这是我的设想

我有一个启动后勤活动的主要活动

这是主要活动的代码

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))
    }
}
正如您在上面的代码中所看到的,我调用finish()方法在启动LoginActivity后终止活动。我想测试主活动启动的登录活动中是否按下了“后退”按钮,应用程序是否关闭且不返回主活动

这是我的测试课

@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.
    }
}
@RunWith(AndroidJUnit4::class)
类维护活动测试{
@规则@JvmField
val mainActivityRule:ActivityTestRule=ActivityTestRule(MainActivity::class.java)
@规则@JvmField
val loginActivityRule:ActivityTestRule=ActivityTestRule(LoginActivity::class.java)
@以前
趣味设置(){
}
@试验
fun Main Activity History ForgottenaAfter StartingLoginActivity()
{
Intents.init()
线程睡眠(MainActivity.LAUNCH\u延迟);
意图.释放()
回按()
//在这里,我如何断言主活动是否未打开。
}
}

请注意代码中的注释。我喜欢断言当登录活动中按下后退按钮时,主活动是否未打开,或者它是否没有返回到主活动。如何测试它?

既然您想测试应用程序的高级交互,您应该使用

首先将库添加到
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)

你不需要任何东西

@Before
fun setUp() {
}
因为它是空的,什么也不做

@get:Rule
val mainActivityRule = ActivityTestRule(MainActivity::class.java)
@Before
fun setUp() {
}