1

プロジェクトに robolectric を統合しようとしていますが、予期しない問題が発生しました。

Robolectric を使用していない場合、プロジェクトは正常にコンパイルされます。ただし、Robolectric で簡単なテストを実行すると、org.apache.http パッケージで NoClassDefFoundError が発生します。

Exception in thread "Thread-1" java.lang.NoClassDefFoundError: org/ 
apache/http/HttpRequest 
        at java.lang.ClassLoader.defineClass1(Native Method) 
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) 
        at java.lang.ClassLoader.defineClass(ClassLoader.java:616) 
        at java.lang.ClassLoader.defineClass(ClassLoader.java:466) 
        at javassist.Loader.findClass(Loader.java:379) 
        at 
com.xtremelabs.robolectric.bytecode.RobolectricClassLoader.findClass(Robole ctricClassLoader.java: 
60) 
        at javassist.Loader.loadClass(Loader.java:311) 
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
        at 
com.xtremelabs.robolectric.bytecode.RobolectricClassLoader.loadClass(Robole ctricClassLoader.java: 
37) 
        at se.hsr.android.Info.updateInfoFromWebService(Info.java:57) 
        at se.hsr.android.Info$2.run(Info.java:99) 
Caused by: java.lang.ClassNotFoundException: caught an exception while 
obtaining a class file for org.apache.http.HttpRequest 
        at javassist.Loader.findClass(Loader.java:359) 
        at 
com.xtremelabs.robolectric.bytecode.RobolectricClassLoader.findClass(Robole ctricClassLoader.java: 
60) 
        at javassist.Loader.loadClass(Loader.java:311) 
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
        at 
com.xtremelabs.robolectric.bytecode.RobolectricClassLoader.loadClass(Robole ctricClassLoader.java: 
37) 
        ... 11 more 
Caused by: java.lang.IllegalStateException: shouldn't be modifying 
bytecode after we've started writing cache! 
class=org.apache.http.HttpRequest 
        at 
com.xtremelabs.robolectric.bytecode.AndroidTranslator.onLoad(AndroidTransla tor.java: 
68) 
        at javassist.Loader.findClass(Loader.java:340) 
        ... 15 more 

プロジェクトのビルドに Maven を使用しており、http-client 4.1 を含めています (Apache ライブラリの http-mime 4.1 に依存しているため)。

Robolectric jar にはデフォルトで httpclient 4.0.3 が含まれているため、http クラスが見つからない理由がわかりません。AndroidTranslator がバイトコードを変更しようとしていることに関係していると思われます (dalvik jvm と互換性を持たせるためですか?)

誰かがこの問題に光を当てることができれば、私たちは非常に感謝しています.

4

1 に答える 1

0

私は同じ問題を抱えていたので、次の除外を追加して修正しました

    <dependency>
        <groupId>com.pivotallabs</groupId>
        <artifactId>robolectric</artifactId>
        <version>1.0-RC1</version>
        <exclusions>
            <exclusion>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
            </exclusion>
        </exclusions>
        <scope>test</scope>
    </dependency>
于 2011-06-01T14:06:29.097 に答える