Java 机器人分子和匕首测试

Java 机器人分子和匕首测试,java,android,robolectric,dagger,Java,Android,Robolectric,Dagger,我正在尝试使用Robolectric(1.2)和Dagger测试一个应用程序 我的测试模块非常简单: @RunWith(RobolectricTestRunner.class) public class XmlTests { // Injected @Inject XmlPullParser mParser; @Inject AlarmActionSpawner mActionSpawner; @Inject FileHelper mFileHelper;

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

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


您可能需要添加一些新的阴影类。了解方法。

好的,当我在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>

注意
override=true
,因为这两个方法将覆盖
XmlServiceModule
中的方法,创建对象图的一个新分支。

哦……如果他们真的需要,我可能会看一看并添加它……因为2.0已经过时了,我想他们将使用“真正的jars”(这是我读到的…)。嘿,Kap,我正在尝试类似的事情,在构建测试模块图时,我收到了一个令人费解的异常。你介意看看有没有看到类似的东西吗干杯。从你的追踪中我可以理解,这是一个不同的问题。您的问题看起来更像是模块配置问题。Dagger的GetModuleDapter抛出了一些注释问题…谢谢Kap:我在SO上发布了这个问题,当我找到解决方案时,我自己回答了。更多细节。
@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();
    }
}