我有一个Android Maven项目,我想实现一个仪器测试,当然应该由maven运行。
但是我得到NoSuchMethodError和NoSuchFieldError。
我的maven项目中有三个模块。
当我执行mvn clean install
时,maven成功执行一切,直到在真正的Android设备上执行android instrumentation-test。
当我自己启动应用程序并单击检测测试失败的按钮时,我没有收到任何错误。所以我认为我的android检测测试的pom.xml肯定有问题。
以下是我如何定义依赖项:
<dependency>
<groupId>de.dornathal</groupId>
<artifactId>core</artifactId>
<version>0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>de.dornathal</groupId>
<artifactId>android</artifactId>
<type>apk</type>
<version>0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>de.dornathal</groupId>
<artifactId>android</artifactId>
<type>jar</type>
<version>0.1-SNAPSHOT</version>
</dependency>
我没有定义任何范围,因此我认为所有类都应该在运行时和测试范围内可用。
DBHelper类包含public static final String[]
之类的
public static final String[] SET_ACTION_LIST = {KEY_ID, KEY_PARENT_ID, KEY_ACTION_ID, KEY_SORT_ORDER, KEY_TYPE_ENUM};
该字段由应用程序项目的类(在onCreateMethod中)调用:
result += printDatabase(db, DBHelper.TABLE_ACTION_LIST, DBHelper.SET_ACTION_LIST);
值得注意的是,这一行不是第一个访问DBHelper字段的行。有十几条类似的行访问DBHelper字段(但当然有不同的字段名)。
当应用程序运行良好时,上面所有内容都不能完全正确。
最后我用机器人进行了仪器测试:
@Override
public void setUp() throws Exception {
this.setActivityInitialTouchMode(false);
solo = new Solo(getInstrumentation(), getActivity());
}
@Override
public void tearDown() throws Exception {
solo.finishOpenedActivities();
}
public void testOpenActivitiesOfMain(){
solo.clickOnView(solo.getView(R.id.ShowDatabase));
solo.assertCurrentActivity("Does not start the Database",Database.class);
solo.goBack();
solo.assertCurrentActivity("Does not return from Database", MainPage.class);}
现在有以下错误输出: 行家:
[INFO] 01498A031900801A_samsung_GalaxyNexus : Running instrumentation tests in de.dornathal.planyourmeals.android.test
[INFO] 01498A031900801A_samsung_GalaxyNexus : Run started: de.dornathal.planyourmeals.android.test, 4 tests:
[INFO] 01498A031900801A_samsung_GalaxyNexus : Start [1/4]: de.dornathal.planyourmeals.android.test.MainPageTest#testOpenActivitiesOfMain
[INFO] 01498A031900801A_samsung_GalaxyNexus : ERROR:de.dornathal.planyourmeals.android.test.MainPageTest#testOpenActivitiesOfMain
[INFO] 01498A031900801A_samsung_GalaxyNexus : Test failed to run to completion. Reason: 'Instrumentation run failed due to 'java.lang.NoSuchFieldError''. Check device logcat for details
[INFO] 01498A031900801A_samsung_GalaxyNexus : End [1/4]: de.dornathal.planyourmeals.android.test.MainPageTest#testOpenActivitiesOfMain
[INFO] 01498A031900801A_samsung_GalaxyNexus : Run failed: Instrumentation run failed due to 'java.lang.NoSuchFieldError'
[INFO] 01498A031900801A_samsung_GalaxyNexus : Run ended: 0 ms
[ERROR] 01498A031900801A_samsung_GalaxyNexus : FAILURES!!!
并且logcat说
11-16 12:07:36.529: ERROR/AndroidRuntime(4581): FATAL EXCEPTION: main
java.lang.NoSuchFieldError: de.dornathal.planyourmeals.core.database.DBHelper.SET_ACTION_LIST
at de.dornathal.planyourmeals.android.view.DatabasePager$DatabaseFragment.onCreateView(DatabasePager.java:42)
如果有人建议如何使用此功能或发生实际错误的位置,我非常感谢任何建议。
MFG Dornathal
答案 0 :(得分:1)
当类更新但未完全重新编译时,通常会抛出NoSuchMethodError或NoSuchFieldError。
事实证明我确实更改了我的库项目的SNAPSHOT版本,以便maven加载旧版本。
如果要测试是否与项目存在同样的问题,请尝试从本地maven存储库中删除包含SNAPSHOT版本的文件夹。 (C:\Users\<username>\.m2\...\yourLibrary\
)
如果您在此之后重新运行maven并且您收到错误消息,说maven没有找到SNAPSHOT.jar,请检查您的poms中是否所有版本号匹配。