Espresso intended(hasComponent(...)) 在简单示例中不起作用

Espresso intended(hasComponent(...)) not working in simple example

有很多这样的问题没有答案,我的一个新的空白项目也有这个问题,知道问题出在哪里吗?我没有做更多的事情:

public class ExampleInstrumentedTest {

@Test
public void useAppContext() {
    Intents.init();
    final Intent intent = new Intent(ApplicationProvider.getApplicationContext(), MainActivity.class);
    try (ActivityScenario<MainActivity> scenario = ActivityScenario.launch(intent)) {
        Log.d("++", "state: " + scenario.getState());
        assertTrue(scenario.getState() == Lifecycle.State.RESUMED);
        intended(hasComponent(MainActivity.class.getName()));
        Intents.release();
    }
}

}

调用Intents.init()也没关系;在 setUp() 或使用 IntentsTestRule 或 ActivityScenarioRule 中,每次都会出现同样的问题:

E/TestRunner: androidx.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: 想要匹配 1 个意图。实际匹配 0 个意图。

Github repo

您的测试失败,因为被测应用程序未启动具有 MainActivity 组件名称的意图。 documentation 表示 intended():

Asserts that the given matcher matches a specified number of intents sent by the application under test.

因此,由于您的被测应用程序使用 MainActivity 作为其启动器 Intent,另一个以 MainActivity 作为其组件的 Intent 将不会被 MainActivity 触发。

一个有效的(更现实的)例子如下:

  • 验证 MainActivity 成功触发 Intent 以启动 OtherActivity
// In MainActivity

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val otherActivity = Intent(this, OtherActivity::class.java)
    startActivity(otherActivity)
}

// In your instrumented test

@Test
fun otherActivityIsLaunchedByMainActivity() {
    Intents.init()

    val intent = Intent(ApplicationProvider.getApplicationContext<Context>(), MainActivity::class.java)
    val scenario = ActivityScenario.launch<MainActivity>(intent)
    intended(hasComponent(OtherActivity::class.java.name))

    Intents.release()
}