【问题标题】:Robolectric and Dagger testingRobolectric 和 Dagger 测试
【发布时间】:2013-03-15 02:45:06
【问题描述】:

我正在尝试使用 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 比较陌生,也许我在实施中做错了什么,我不认为在配置中。 我应该检查什么以确保一切正常?你们看到这段代码有什么明显的错误吗?

【问题讨论】:

  • 嘿Kap,我现在正在尝试类似的东西,在构建我的测试模块图时我收到了一个令人费解的异常。你介意看看你是否看到类似的东西吗? pastebin.com/G33aHkAa - 干杯。
  • 从您的跟踪中我可以理解,这是一个不同的问题。您的问题看起来有点像模块配置问题。 Dagger 的 getModuleAdapter 吐出一些注解问题...
  • 感谢 Kap:我在 SO 上发布了问题,并在找到解决方案后自行回答。更多详情here.

标签: java android robolectric dagger


【解决方案1】:

据我所知,Robolectric 不支持 XmlPullParser 及其工厂。

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

【讨论】:

  • 哦...如果他们真的需要它,我可能会看看并添加它...因为 2.0 已经发布,我认为他们将使用“真正的 jars”(这就是我读过...)..
【解决方案2】:

好的,在 GitHub 上等待答案以查看是否值得为 Robolectric 构建 XmlPullParser 和 XmlSerializer 的影子时,我通过这种方式解决了我的问题。这正是我喜欢 Dagger 和 Dependency Injector 框架(当然还有 Maven)的原因。更改实际上花费了 10 分钟,比写下这个答案还短,现在它的工作就像一个魅力。

我在我的 pom 中添加了 Kxml 依赖项:

<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 中的一个,创建对象图的一个新分支。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    相关资源
    最近更新 更多