仅当使用ANT运行测试时,库项目类的NoClassDefFoundError

时间:2012-09-05 18:29:15

标签: android unit-testing ant robolectric

我将ViewPagerIndicator添加到我的项目中(这是一个Android库项目),我的测试从IntelliJ运行良好,但是当我从ANT运行它们时失败了。需要说明的是,只有引用此Android库项目中的类的测试失败,其余测试都没有任何问题。我猜我的build.xml中有些东西不正确?还有其他人遇到过这个吗?

这是堆栈跟踪:

  

java.lang.NoClassDefFoundError:   LCOM / viewpagerindicator / CirclePageIndicator;   。com.google.inject.internal.util $ ComputationException:   java.lang.NoClassDefFoundError:   LCOM / viewpagerindicator / CirclePageIndicator;在   com.google.inject.internal.util。$ $地图制作StrategyImpl.compute(MapMaker.java:553)     在   com.google.inject.internal.util。$ $地图制作StrategyImpl.compute(MapMaker.java:419)     在   com.google.inject.internal.util。$ CustomConcurrentHashMap $ ComputingImpl.get(CustomConcurrentHashMap.java:2041)     在   com.google.inject.internal.FailableCache.get(FailableCache.java:50)     在   com.google.inject.internal.MembersInjectorStore.get(MembersInjectorStore.java:65)     在   com.google.inject.internal.InjectorImpl.getMembersInjector(InjectorImpl.java:950)     在   com.google.inject.internal.InjectorImpl.getMembersInjector(InjectorImpl.java:957)     在   com.google.inject.internal.InjectorImpl.injectMembers(InjectorImpl.java:943)     在   roboguice.inject.ContextScopedRoboInjector.injectMembersWithoutViews(ContextScopedRoboInjector.java:243)     在roboguice.activity.RoboActivity.onCreate(RoboActivity.java:78)at at   com.mycompany.myproduct.activities.TutorialActivity.onCreate(TutorialActivity.java:36)     在   com.mycompany.myproduct.activities.TutorialActivityTest.setup(TutorialActivityTest.java:37)     在   com.xtremelabs.robolectric.RobolectricTestRunner $ 1.evaluate(RobolectricTestRunner.java:292)

1 个答案:

答案 0 :(得分:0)

我想出来了。

build.xml 中的junit目标下的test任务中(我从Github上的AndroidIntellijStarter项目获取了代码段),您需要添加一个classpath引用,指向为您项目中包含的每个库项目构建的 classes.jar 文件。

可能有一种更优雅的方式来实现这一点,但这是我在短时间内提出的:

<target name="test" depends="compile.tests" description="test all">
        <mkdir dir="${out.dir}/out/reports/tests"/>
        <junit showoutput="true" failureproperty="junit.failure">
            <formatter type="plain" usefile="false" if="junit.console.out"/>
            <formatter type="plain"/>
            <formatter type="xml"/>
            <batchtest todir="${out.dir}/out/reports/tests">
                <fileset dir="${tested.project.test.absolute.dir}">
                    <include name="**/*Test.java"/>
                </fileset>
            </batchtest>
            <classpath>
                <!-- Project -->
                <pathelement path="${out.classes.absolute.dir}"/>
                <pathelement path="${out.test.classes.absolute.dir}"/>
                <fileset dir="${extensible.libs.classpath}" includes="**/*.jar"/>

                <!-- Library Project Here -->
                <fileset dir="path/to/classes/jar" includes="*.jar"/>

                <!-- Robolectric -->
                <fileset dir="submodules/robolectric/lib/main" includes="*.jar"/>
                <pathelement path="submodules/robolectric/bin/mainClasses"/>

                <!-- Android -->
                <path refid="android.target.classpath"/>
            </classpath>
        </junit>
        <fail if="junit.failure" message="Unit test(s) failed.  See reports!"/>
</target>