2013-03-15 75 views
3

我正在嘗試使用Robolectric(1.2)和Dagger測試應用程序。Robolectric和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和匕首,也許我做錯事的實施,我不認爲在配置中。 我應該檢查什麼以確保一切正常?你們看到這段代碼有什麼明顯的錯誤嗎?

+0

Hey Kap,我正在嘗試類似的事情,並且在構建我的測試模塊圖時收到了令人困惑的異常。你介意看看是否看到類似的東西嗎? http://pastebin.com/G33aHkAa - 乾杯。 – OceanLife 2013-06-10 00:01:56

+0

從我的蹤跡可以看出,這是一個不同的問題。你的問題看起來更像是一個模塊配置問題。匕首的getModuleAdapter吐出一些註釋問題... – 2013-06-27 10:30:14

+0

謝謝Kap:我在SO上發佈了這個問題,並在找到解決方案時自我回答。更多細節[here](http://stackoverflow.com/questions/17144824/robolectric-dagger-and-compile-time-moduleadapter-creation)。 – OceanLife 2013-06-27 13:02:24

回答

1

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

您可能想要添加一些新的影子類。瞭解如何here

+0

哦......我可能會看看,然後添加它,然後,如果他們真的需要它...因爲2.0出來了,我想他們會使用「真正的罐子」(這個是我讀的...).. – 2013-03-15 04:00:17

+0

我猜XmlSerializer也不支持。這樣對嗎? – 2013-03-15 14:00:37

1

好吧,在等待GitHub上的答案以查看是否值得爲Robolectric創建XmlPullParser和XmlSerializer的陰影時,我通過這種方式解決了我的問題。這正是我非常喜歡Dagger和Dependency Injector框架的原因(當然還有Maven)。這個改變花費了10分鐘,比寫這個答案要少,現在它像一個魅力一樣工作。

我加KXML dependeny到我的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 = true,因爲這兩種方法都將覆蓋XmlServiceModule之一,創建對象圖的新分支。