我有一个接受深层链接的应用程序。
的Manifest.xml :
<activity
android:name=".activities.unsigned.MagicLink"
android:label="Some test">
<intent-filter android:label="Test">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="com.myapp" />
</intent-filter>
</activity>
<activity
android:name=".activities.unsigned.MainScreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
活动:
public class MagicLink extends BusAppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
if (intent != null && intent.getAction() != null) {
Uri data = intent.getData();
ServicesApi servicesApi = ServicesApi.init(this);
servicesApi.setSessionId(data.getQueryParameter(HttpRemoteApi.SESSION_ID));
startActivity(new Intent(this, LoginActivity.class));
}
}
}
如果用户使用它,这个功能非常有效。好吧,我想现在为它创建一个测试。所以我写了这样的话:
androidTest :
@RunWith(AndroidJUnit4.class)
@LargeTest
public class LoginTest {
@Rule
public final ActivityTestRule<MainScreen> main = new ActivityTestRule<>(MainScreen.class);
@Test
public void checkSmth() {
clickMagicLink();
//...
}
private void clickMagicLink() {
String url = "com.myapp://login?session_id="+utils.getSessionId();
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
main.launchActivity(i);
}
}
但是,不是开始MagicLink
活动,而是开始MainScreen
活动(MAIN
)。我做错了什么?
P.S。我也看到过这样的事情:new ActivityTestRule<>(MainScreen.class,true, false);
。但是使用这个构造函数我的测试开始,但Android应用程序没有(我的意思是模拟器启动,但应用程序没有)
答案 0 :(得分:4)
ActivityTestRule.launchActivity()
始终启动正在测试的活动。您无法使用它来启动任何其他活动。在这种情况下,它将始终以MainActivity
开始。 Intent
参数将传递给活动。这允许您在测试期间发送额外内容。目的是不用于选择要启动的活动。
另请注意,文档说
请勿直接调用此方法,除非您明确要求不要使用
ActivityTestRule(Class, boolean, boolean)
中的launchActivity标志手动启动活动。
如果您想测试MagicLink
活动,可以使用ActivityTestRule<MagicLink>
:
@RunWith(AndroidJUnit4.class)
@LargeTest
public class MagicLinkTest {
@Rule
public final ActivityTestRule<MagicLink> main = new ActivityTestRule<>(MainScreen.class, false, false);
@Test
public void testMagicLink() {
String url = "com.myapp://login?session_id="+utils.getSessionId();
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
main.launchActivity(i);
// assertions go here
}
}
您也可以使用ActivityTestRule<MainScreen>
,但必须模拟与实际用户完全相同的操作。