使用maven进行Android集成测试中的NoSuchFieldError

时间:2013-11-16 12:17:01

标签: android maven android-testing

我有一个Android Maven项目,我想实现一个仪器测试,当然应该由maven运行。

但是我得到NoSuchMethodError和NoSuchFieldError。

我的maven项目中有三个模块。

  1. 核心库,我在其中定义了DBHelper类
  2. android应用程序项目。
  3. android检测测试项目。
  4. 当我执行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

1 个答案:

答案 0 :(得分:1)

当类更新但未完全重新编译时,通常会抛出NoSuchMethodError或NoSuchFieldError。

事实证明我确实更改了我的库项目的SNAPSHOT版本,以便maven加载旧版本。

如果要测试是否与项目存在同样的问题,请尝试从本地maven存储库中删除包含SNAPSHOT版本的文件夹。 (C:\Users\<username>\.m2\...\yourLibrary\

如果您在此之后重新运行maven并且您收到错误消息,说maven没有找到SNAPSHOT.jar,请检查您的poms中是否所有版本号匹配。