我想实现自定义Application
类Shadow,以覆盖其中的getInstance()
方法。我正在使用Robolectric 3.0并创建了一个MyRobolectricTestRunner
类,覆盖了createClassLoaderConfig()
方法,如下所示:
public class MyRobolectricTestRunner extends RobolectricTestRunner {
public MyRobolectricTestRunner(Class<?> testClass) throws InitializationError {
super(testClass);
}
@Override
public InstrumentationConfiguration createClassLoaderConfig() {
InstrumentationConfiguration.Builder builder = InstrumentationConfiguration.newBuilder();
builder.addInstrumentedClass(App.class.getName());
return builder.build();
}
}
ShadowApp类如下所示:
@Implements(App.class)
public class ShadowApp{
@RealObject private static App instance;
public static void setAppInstance(App app){
instance = app;
}
@Implementation
public static App getInstance(){
return instance;
}
}
使用Runner的测试注释如下:
@RunWith(MyRobolectricTestRunner.class)
@Config(manifest=Config.NONE, shadows = {ShadowApp.class}, constants = BuildConfig.class, sdk = 21)
public class SomeShadowTest {
现在的问题是,当我手动运行测试时(点击&#34;运行......&#34;仅针对此单个测试类),它会毫无问题地通过,但是当我使用Gradle&#时34; testDebug&#34;任务,测试失败,好像完全没有使用Shadow类:(
我已经尝试将Runner父类更改为RobolectricGradleTestRunner
,但是当它强迫我使ShadowApp
类扩展ShadowApplication
类时,它最终处于死胡同,该类具有getInstance ()方法以及...... :(
有关如何解决此问题的任何提示?
答案 0 :(得分:0)
我建议您不要为应用程序创建阴影,而是使用Robolectric用作应用程序类的测试变体的TestApplication类。
为此,您只需要创建扩展应用程序类的类,并将其命名为Test,并将其放在项目的根目录中 - 类的包与项目的包名相同。
见下面的例子:
假设您的包名称为com.example.robolectric
// src/main/java/com/example/robolectric
public class YourAplication extends Application {
...
}
// src/test/java/com/example/robolectric
/**
* Robolectric uses class with name Test<ApplicationClassName> as test variant of the application
* class. We use test application for API class injection so we need test version of this class.
*/
public class TestYourAplication extends YourAplication {
...
}