从Gradle

时间:2015-10-11 10:07:36

标签: java android gradle robolectric

我想实现自定义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 ()方法以及...... :(

有关如何解决此问题的任何提示?

1 个答案:

答案 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 {
   ...
}