我正在尝试使用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相对较新,也许我在实现中做错了,我不认为在配置中。 我应该检查什么以确保一切正常?你们在这段代码中看到任何明显的错误吗?
答案 0 :(得分:1)
据我所知,XmlPullParser& Robolectric不支持其工厂。
您可能想要添加一些新的影子类。了解here。
的方式答案 1 :(得分:1)
好的,在等待GitHub的答案,看看是否值得为Robolectric建立XmlPullParser和XmlSerializer的阴影时,我就这样解决了我的问题。这正是我一般喜欢Dagger和Dependency Injector框架(当然还有Maven)的原因。这个变化花费了10分钟,比写这个答案要少,现在它的工作就像一个魅力。
我将Kxml dependdeny添加到我的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
中的方法,创建对象图的新分支。