Android Instrumentation测试报错:点击按钮未启动Activity B,意图匹配为0
场景说明
存在两个Activity(A-B),Activity A的逻辑全部托管在其XML加载的Fragment中,自身无代码逻辑。需求是点击Fragment中的按钮后启动Activity B,但执行UI测试时报错未匹配到启动Activity B的Intent。
Fragment代码
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding?.openActivityBtn?.setClickListener { requireActivity().startActivity(Intent(requireActivity(),ActivityA::class.java)) requireActivity().finish() } }
测试代码(使用已废弃的ActivityTestRule)
@get:Rule var activityRule = ActivityTestRule(ActivityA::class.java, false, false) @Before fun setUp(){ Intents.init() activityRule.launchActivity(Intent()) } @Test fun shouldShowEmptyUI(){ onView(isRoot()).check(noOverlaps()) onView(withResourceName("some_ui_component")).check(matches(isDisplayed())) onView(withResourceName("some_ui_component")).check(matches(isDisplayed())) onView(withResourceName("open_activity_btn")).check(matches(isDisplayed())) onView(withResourceName("open_activity_btn")).perform(click()) intended(hasComponent(ComponentName(ApplicationProvider.getApplicationContext(), ActivityB::class.java.name))) } @After fun tearDown(){ Intents.release() }
测试报错信息
androidx.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: Wanted to match 1 intents. Actually matched 0 intents.
IntentMatcher: has component: has component with: class name: is "com.package.ActivityB" package name: an instance of java.lang.String short class name: an instance of java.lang.String
Matched intents:[]
解决方案
核心问题出在Fragment的点击事件代码中:你启动的是ActivityA而非需求中的ActivityB,导致测试时无法检测到启动ActivityB的Intent。
修改Fragment代码中的Intent目标类:
binding?.openActivityBtn?.setClickListener { // 将ActivityA::class.java改为ActivityB::class.java requireActivity().startActivity(Intent(requireActivity(), ActivityB::class.java)) requireActivity().finish() }
另外补充:ActivityTestRule已被官方废弃,建议迁移到ActivityScenario进行UI测试,它提供了更灵活的Activity生命周期控制方式。
内容的提问来源于stack exchange,提问作者Claude Hangui

