2

私はこれを理解しようと何時間も費やしました。

私はMavenを使用して、Robolectricを使用してIntelliJIDEAでプロジェクトをビルドおよびテストしています。POMでAndroidの前にRobolectricを宣言し、SDKデプロイヤーを使用してローカルリポジトリにインストールしました。しかし、私はまだこのエラーを受け取り続けます:

java.lang.RuntimeException:スタブ!android.net.Uri。$$robo$$ Uri_30fc_parse(Uri.java:53)at org.robolectric.bytecode.ShadowWrangler $ InvocationPlan.callOriginal(ShadowWrangler.java:591)at android.net.Uri.parse(Uri。 java)at org.robolectric.shadows.ShadowMediaStore.reset(ShadowMediaStore.java:27)at org.robolectric.Robolectric.resetStaticState(Robolectric.java:821)at org.robolectric.RobolectricTestRunner.resetStaticState(RobolectricTestRunner.java:224)at org.robolectric.RobolectricTestRunner.internalBeforeTest(RobolectricTestRunner.java:133)at org.robolectric.RobolectricTestRunner.methodBlock(RobolectricTestRunner.java:96)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)at org .runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:

そして、私のpom.xmlは正確に次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.jemson</groupId>
<artifactId>notecloud-mobile</artifactId>
<version>.01</version>
<packaging>apk</packaging>
<name>Note-Cloud Mobile</name>

<profiles>
    <profile>
        <id>offline</id>
        <properties>
            <config.scheme>http://</config.scheme>
            <config.host>10.0.2.2</config.host>
            <config.path>/notecloudtest/index.html</config.path>
        </properties>
    </profile>
    <profile>
        <id>online</id>
        <properties>
            <config.scheme></config.scheme>
            <config.host></config.host>
            <config.path></config.path>
        </properties>

    </profile>
</profiles>

<dependencies>
    <dependency>
        <groupId>com.logician</groupId>
        <artifactId>abstractmodel</artifactId>
        <version>1</version>
    </dependency>
    <dependency>
        <groupId>com.androidquery</groupId>
        <artifactId>android-query</artifactId>
        <version>0.24.3</version>
    </dependency>

    <dependency>
        <groupId>org.robolectric</groupId>
        <artifactId>robolectric</artifactId>
        <version>2.0-alpha-2</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-core</artifactId>
        <version>1.2</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>com.googlecode.androidannotations</groupId>
        <artifactId>androidannotations</artifactId>
        <version>2.7</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>com.googlecode.androidannotations</groupId>
        <artifactId>androidannotations-api</artifactId>
        <version>2.7</version>
    </dependency>


    <dependency>
        <groupId>android</groupId>
        <artifactId>android</artifactId>
        <version>4.2.2_r2</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>android.support</groupId>
        <artifactId>compatibility-v4</artifactId>
        <version>12</version>
    </dependency>

</dependencies>


<build>
    <finalName>${project.artifactId}</finalName>
        <plugins>

            <plugin>
                <groupId>com.google.code.maven-replacer-plugin</groupId>
                <artifactId>replacer</artifactId>
                <version>1.5.2</version>
                <executions>
                    <execution>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>replace</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <file>templates/Config.java</file>
                    <outputFile>src/main/java/org/jemson/notecloud/Config.java</outputFile>
                    <replacements>
                        <replacement>
                            <token>#scheme</token>
                            <value>${config.scheme}</value>
                        </replacement>
                        <replacement>
                            <token>#host</token>
                            <value>${config.host}</value>
                        </replacement>
                        <replacement>
                            <token>#path</token>
                            <value>${config.path}</value>
                        </replacement>
                    </replacements>
                </configuration>
            </plugin>

            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>

            <plugin>
                <!-- See http://code.google.com/p/maven-android-plugin/ -->
                <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                <artifactId>android-maven-plugin</artifactId>
                <version>3.4.1</version>
                <configuration>
                    <sdk>
                        <platform>17</platform>
                    </sdk>
                </configuration>
                <extensions>true</extensions>
            </plugin>


        </plugins>
</build>

AbstractModelは私自身の個人的な便利なライブラリです。内部的にはUriクラスを使用しません。Android-Queryに関しては、よくわかりません。私が思うに、Uri.parse()の問題のある呼び出しは、私がテストしているActivityクラスにあります。何が起こるかを確認するために呼び出しをコメント化しようとしましたが、それでも例外がスローされます。

IntelliJモジュール構成でRobolectricの依存関係を移動して、Androidの前に実際に含まれていることを確認してみました。POMファイルと.imlファイルをRobolectricSampleプロジェクトファイルにできるだけ近づけました。プロジェクトツリー内のすべてのIntelliJファイルを削除し、POMからプロジェクトを再度開きました。何もない。

私は絶対に混乱しています。私は考えられるすべてを試しました。このプロジェクトではRobolectricを廃止し、エミュレーターでアプリを実行してテストすることを検討しています。

4

1 に答える 1

3

私はあなたと同じ問題を抱えています。また、もう1

役に立たないテキストカット

アップデート1。

githubでこの問題が見つかりました: https ://github.com/pivotal/robolectric/issues/426

一部の人々は、macosではそれが機能すると話します。

アップデート2。

回避策が見つかりました(esam091によるコメント):

public class YourTestRunner extends RobolectricTestRunner
{
    public YourTestRunner(Class<?> testClass) throws InitializationError
    {
        super(RobolectricContext.bootstrap(YourTestRunner.class, testClass,
            new RobolectricContext.Factory()
            {
                @Override
                public RobolectricContext create()
                {
                    return new RobolectricContext()
                    {
                        @Override
                        public boolean useAsm() // this override does the trick
                        {
                            return false;
                        }

                        @Override
                        protected AndroidManifest createAppManifest()
                        {
                            return new AndroidManifest(
                                new File("YourApp/src/main/android/AndroidManifest.xml"),
                                new File("YourApp/src/main/android/resources"));
                        }
                    };
                }
            }));
    }

    @Override
    public void prepareTest(Object test)
    {
        RoboGuice.injectMembers(Robolectric.application, test);
    }
}

@RunWith(YourTestRunner.class)AndroidAPIを使用する各テストで指定します。

アップデート3。

修正された問題: https ://github.com/pivotal/robolectric/pull/458

于 2013-04-02T19:01:41.640 に答える