我想实现一个自定义的 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 {
现在的问题是,当我手动运行测试时(仅针对这个单个测试类点击“运行...”),它通过没有问题,但是当我使用 Gradle“testDebug”任务时,测试失败,好像根本没有使用影子类:(
我曾尝试将 Runner 父类更改为
RobolectricGradleTestRunner
,但是当它迫使我使 ShadowApp
类扩展一个 ShadowApplication
类时,最终陷入了死胡同,该类也具有 getInstance() 方法...... :(有关如何解决此问题的任何提示?
最佳答案
我建议您不要为应用程序创建阴影,而是使用 TestApplication 类,Robolectric 将其用作应用程序类的测试变体。
为此,您只需要创建扩展您的应用程序类并具有名称 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 {
...
}
关于java - 从 Gradle 启动时,Robolectric 自定义 TestRunner 不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33063791/