簡體   English   中英

Robolectric和Dagger測試

[英]Robolectric and Dagger testing

我正在嘗試使用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;
    }

一切都很好,我可以在eclipse中調試,直到命中XmlPullParserFactory.newInstance() 那時,我收到了可怕的:

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

我對Robolectric和Dagger比較新,也許我在實現中做錯了,我不認為在配置中。 我應該檢查什么以確保一切正常? 你們在這段代碼中看到任何明顯的錯誤嗎?

據我所知,Robolectric不支持XmlPullParser及其工廠。

您可能想要添加一些新的影子類。 在這里學習如何。

好的,在等待GitHub上的答案,看看是否值得為Robolectric建立XmlPullParser和XmlSerializer的陰影時,我就這樣解決了我的問題。 這正是我一般喜歡Dagger和Dependency Injector框架(當然還有Maven)的原因。 這個改變已經花了10分鍾,比寫這個答案還要少,現在它的工作就像一個魅力。

我在我的pom中添加了Kxml dependdeny:

<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 = true因為這兩個方法將覆蓋XmlServiceModule ,從而創建對象圖的新分支。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM