我有两个通过意图相互交互的应用程序。我想验证一下,让 App A 正确调用 App B 的startActivity
而不实际启动 App B 。我尝试了intending
和Espresso的各种组合仍然通过意图启动 App B 而不是仅仅将其删除。这会导致其余测试失败,因为 App B 阻止了UI。有什么想法吗?
@RunWith( AndroidJUnit4.class )
@LargeTest
public class MyActivityUiIntentsTest
{
@Rule
public IntentsTestRule<MyActivity> activityRule =
new IntentsTestRule<>( MyActivity.class, true, false );
@Test
public void shouldStartOtherActivityWhenButtonClicked ()
{
Intents.init();
intending( toPackage( "my.package" ) )
.respondWith( new ActivityResult( Activity.RESULT_OK, null ) );
activityRule.launchActivity( new Intent() );
onView( withId( R.id.viewId ) ).perform( click() );
intended( hasComponent( hasShortClassName( "the.other.class.name" ) ) );
Intents.release();
}
}
已更新: onClick
的代码:
@OnClick( R.id.viewId )
public void startOtherActivity ()
{
Intent intent = new Intent();
intent.setClassName( "my.package", "the.other.class.name" );
startActivity( intent );
finish();
}
答案 0 :(得分:3)
将您的intending...
代码移至launchActivity下方并删除.init()
,因为IntentsTestRule
会在活动启动后为您调用init
答案 1 :(得分:2)
其中一种可能的解决方案是使用间接进行意图调度。
例如,我们有IntentDispatcher
,我们通过使用custom instrumentation test runner的技巧替换功能ui测试中的测试实现。
IntentDispatcher
的真实实施仅调用context.startActivity()
,而在测试中,我们会打开显示Intent
所有内容的特殊活动,以便我们能够验证它是Intent
1}}我们想用Espresso匹配器处理。
此外,我们还编写了大量规则来处理打开相机应用和模拟结果或仅仅模拟常规startActivity()
来电等事情。