我的Android应用程序中的MainActivity检查用户是否已登录(这些信息存储在SharedPreferences中),如果没有登录,则将用户带到LoginActivity。我正在尝试使用以下代码进行测试:
public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {
private static final int TIME_OUT = 5000; /* miliseconds */
private MainActivity mMainActivity;
private Instrumentation mInstrumentation;
private SharedPreferences mLoginPrefs;
public MainActivityTest() {
super(MainActivity.class);
}
protected void setUp() throws Exception {
super.setUp();
setActivityInitialTouchMode(false);
mMainActivity = getActivity();
mInstrumentation = getInstrumentation();
mLoginPrefs = mInstrumentation.getTargetContext().getSharedPreferences(LoginActivity.PREFS_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = mLoginPrefs.edit();
// User is not logged in, so it should be redirect to LoginActivity
editor.putBoolean("logged_in", false);
editor.commit();
}
//...
public void testC_OpenLoginActivityIfUserIsNotLoggedIn() {
ActivityMonitor monitor = mInstrumentation.addMonitor(LoginActivity.class.getName(), null, false);
Activity nextActivity = mInstrumentation.waitForMonitorWithTimeout(monitor, TIME_OUT);
assertNotNull(nextActivity);
nextActivity.finish();
SharedPreferences.Editor editor = mLoginPrefs.edit();
// Login the user so we can continue the tests
editor.putBoolean("logged_in", true);
editor.commit();
}
但是这种方法不起作用,LoginActivity会打开但是waitForMonitorWithTimeout从未返回,所以我被卡在了LoginActivity上(我需要回到MainActivity来进行其他测试)。
类似于这个SO问题的代码适用于按钮点击,但是这个Activity不是由任何点击加载的,所以我认为可能没有时间让监视器工作。
我只需要一种方法来获取实际的Activity,这样我就可以进行断言并使其完成以继续我的测试。
还有一件事:如果可能的话,我更喜欢不使用Robotium的方法。
addMonitor()
函数中的类名应该怎么传递?我尝试了"com.locuslabs.sdktestapp.MapActivity"
、MapActivity::class.java.name.toString()
、MapActivity::class.java.canonicalName.toString()
等等,但是waitForMonitorWithTimeout()
返回的结果都是null
。 - Michael Osofsky