有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java机器人分子和匕首测试

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


共 (2) 个答案

  1. # 1 楼答案

    好的,在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中的方法,从而创建对象图的新分支

  2. # 2 楼答案

    据我所知,XmlPullParser&;它的工厂没有Robolectric的支持

    您可能需要添加一些新的阴影类。学习如何here