3

Robolectric (1.2) と Dagger を使用してアプリをテストしようとしています。

私のテスト モジュールは非常に単純です。

@RunWith(RobolectricTestRunner.class)
public class XmlTests {
    // Injected
    @Inject XmlPullParser mParser;
    @Inject AlarmActionSpawner mActionSpawner;
    @Inject FileHelper mFileHelper;
    @Inject XmlSerializer mSerializer;
    @Inject ConcurrentObjectMonitor mObjMonitor;

    @Module(
        includes = ServicesModule.class,
        entryPoints = XmlTests.class,
        overrides = true
    )
    static class TestModule {
        public TestModule() { }
    }

    @Before
    public void setUp() throws Exception {
        Log.i("setUp() entering.");

        ObjectGraph og = ObjectGraph.create(new TestModule());
        og.validate();
        og.inject(this);
        ...

含まれている ServiceModule には XmlServiceModule が含まれています。

@Module
public class XmlServiceModule {

    @Provides @Singleton XmlSerializer provideXmlSerializer() {
        return android.util.Xml.newSerializer();
    }

    @Provides @Singleton XmlPullParser provideXmlPullParser() {
        XmlPullParser pullParser = null;
        try {
            XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();
            pullParser = xppf.newPullParser();
        } catch (XmlPullParserException e) {
            throw new RuntimeException(e.getMessage());
        }
        return pullParser;
    }

XmlPullParserFactory.newInstance()がヒットするまで、すべて問題ありません。Eclipse 内でデバッグできます。その時点で、私は恐ろしいものを受け取ります:

java.lang.RuntimeException: Stub!
    at org.xmlpull.v1.XmlPullParserFactory.newInstance(XmlPullParserFactory.java:13)
    at ....
    at ....

私はRobolectricとDaggerに比較的慣れていません。実装で何か間違ったことをしているのかもしれませんが、構成では考えていません。すべてが正常であることを確認するには、何を確認すればよいですか? このコードに明らかな間違いがありますか?

4

2 に答える 2

1

OK、Robolectric の XmlPullParser と XmlSerializer のシャドウを構築する価値があるかどうかを確認するために GitHub で回答を待っている間、私はこの方法で問題を解決しました。これこそが、私が一般的に Dagger と Dependency Injector フレームワーク (そしてもちろん Maven) をとても気に入っている理由です。変更には、この回答を書くよりも文字通り 10 分もかからず、今では魔法のように機能しています。

Kxml の依存関係を pom に追加しました。

<dependency>
    <groupId>net.sf.kxml</groupId>
    <artifactId>kxml2</artifactId>
    <version>2.3.0</version>
    <scope>test</scope>
</dependency>

次に、テスト モジュールを次のように変更しました。

@Module(
    includes = ServicesModule.class,
    entryPoints = XmlTests.class,
    overrides = true
)
static class TestModule {
    public TestModule() { }

    @Provides @Singleton XmlSerializer provideXmlSerializer() {
        return new KXmlSerializer();
    }

    @Provides @Singleton XmlPullParser provideXmlPullParser() {
        return new KXmlParser();
    }
}

override = true2 つのメソッドが のメソッドをオーバーライドしXmlServiceModule、オブジェクト グラフの新しいブランチを作成することに注意してください。

于 2013-03-15T23:12:52.160 に答える
1

私が知る限り、XmlPullParser とそのファクトリは Robolectric でサポートされていません。

いくつかの新しいシャドウ クラスを追加したい場合があります。ここで方法を学びます。

于 2013-03-15T03:27:29.243 に答える