Android NoClassDefFoundError碎片活动测试

Android NoClassDefFoundError碎片活动测试,android,android-fragments,Android,Android Fragments,我正在尝试创建一个简单的Android活动测试,它检查在单击按钮时是否启动了一个新的活动。守则: public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> { public LoginActivityTest() { super(LoginActivity.class); } @Override protected void setUp() throws E

我正在尝试创建一个简单的Android活动测试,它检查在单击按钮时是否启动了一个新的活动。守则:

public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> {

public LoginActivityTest() {
    super(LoginActivity.class);
}

@Override
protected void setUp() throws Exception {
    super.setUp();

    setActivityInitialTouchMode(false);

    mActivity = getActivity();

    mLoginButton = (Button) mActivity.findViewById(R.id.login_button);
    mSkipButton = (Button) mActivity.findViewById(R.id.skip_button);
}

{...}

public void testSkipButton() {
    Instrumentation.ActivityMonitor monitor =
    getInstrumentation().addMonitor(
        "com.mycompany.myproject.view.QuestionsActivity",  null, false);

    mActivity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            mSkipButton.requestFocus();
            mSkipButton.performClick();
        }
    });

    QuestionsActivity nextActivity =
            (QuestionsActivity) getInstrumentation().waitForMonitorWithTimeout(monitor, 20);
    assertNotNull(nextActivity);
    nextActivity.finish();
}

private LoginActivity mActivity;
private Button mLoginButton;
private Button mSkipButton;
}
公共类LoginActivityTest扩展了ActivityInstrumentationTestCase2{
公共后勤活动测试(){
超级(LoginActivity.class);
}
@凌驾
受保护的void setUp()引发异常{
super.setUp();
setActivityInitialTouchMode(假);
mActivity=getActivity();
mLoginButton=(按钮)mActivity.findviewbyd(R.id.login_按钮);
mSkipButton=(按钮)mActivity.findviewbyd(R.id.skip_按钮);
}
{...}
公共void testSkipButton(){
仪器仪表.活动监视器=
getInstrumentation().addMonitor(
“com.mycompany.myproject.view.QuestionsActivity”,null,false);
mActivity.runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
mSkipButton.requestFocus();
mSkipButton.performClick();
}
});
问题活动性=
(QuestionsActivity)getInstrumentation().waitForMonitorWithTimeout(监视器,20);
assertNotNull(nextActivity);
nextActivity.finish();
}
私人物流活动;
专用按钮mLoginButton;
私人按钮MSKIPBUTON;
}
当我到达waitForMonitorWithTimeout()时,将引发NoClassDefFoundException

重要的是要考虑到QuestionsActivity(应该启动的活动)是一个碎片活动,不是一个活动,而是碎片活动继承自活动,所以我真的不明白那里发生了什么。可能InstrumentationTest无法处理片段或碎片活动

MacActivity是当前正在测试的活动,它是一个纯活动


求求你,救命

问题是我添加了对测试项目中支持库的引用。请参阅此链接:


现在测试工作正常:)

您的测试项目中是否包含supportLib?是的,我包含了android-support-v4库。我尝试将活动作为目标,而不是碎片活动,现在我在“nextActivity”中得到null,因此assertNotNull失败。我想知道这工作是否真的。。。当我运行2个测试,执行简单的点击而不进行检查时,我会随机得到NullPointerException…使用常规活动得到的null是由于超时造成的:它是以毫秒为单位的,而不是以秒为单位的,正如文档错误地声明的那样()。更多信息:问题在这里(Instrumentation类):公共最终活动waitForActivity(){synchronized(this){while(mLastActivity==null){try{wait();}catch(interruptedeexception e){}Activity res=mlasactivity;mlasactivity=null;return res;}}}当运行wait()时,我得到一个java.lang.IllegalAccessError;我认为UI线程IIRC中不允许使用wait()。