Java 从Gradle启动时Robolectric自定义TestRunner不工作

Java 从Gradle启动时Robolectric自定义TestRunner不工作,java,android,gradle,robolectric,Java,Android,Gradle,Robolectric,我想实现一个自定义的应用程序类阴影,以覆盖其中的getInstance()方法。我正在使用Robolectric 3.0,创建了一个MyRobolectrictTestRunner类,覆盖了createClassLoaderConfig()方法,如下所示: public class MyRobolectricTestRunner extends RobolectricTestRunner { public MyRobolectricTestRunner(Class<?> t

我想实现一个自定义的
应用程序
类阴影,以覆盖其中的
getInstance()
方法。我正在使用Robolectric 3.0,创建了一个
MyRobolectrictTestRunner
类,覆盖了
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();
    }
}
@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;
    }
}
@RunWith(MyRobolectricTestRunner.class)
@Config(manifest=Config.NONE, shadows = {ShadowApp.class}, constants = BuildConfig.class, sdk = 21)
public class SomeShadowTest {
使用转轮的测试注释如下:

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();
    }
}
@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;
    }
}
@RunWith(MyRobolectricTestRunner.class)
@Config(manifest=Config.NONE, shadows = {ShadowApp.class}, constants = BuildConfig.class, sdk = 21)
public class SomeShadowTest {
现在的问题是,当我手动运行测试时(仅针对单个测试类点击“run…”),它会顺利通过,但当我使用Gradle“testDebug”任务时,测试失败,就好像根本没有使用影子类一样:(

我曾尝试将Runner父类更改为
RobolectricGradeleteStrunner
,但当它迫使我使
ShadowApp
类扩展一个
ShadowApplication
类时,它也有getInstance()方法,结果陷入了死胡同…:(


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

我建议您不要为应用程序创建shadow,而是使用TestApplication类,Robolectric将其用作应用程序类的测试变体

为此,您只需要创建一个类,该类扩展了您的应用程序类,并具有名称测试,并且放置在项目的根目录中—类的包和项目的包名称相同

见下例:

假设您的包名是
com.example.roblectric

// src/main/java/com/example/robolectric
public class YourAplication extends Application {
   ...
}

//src/test/java/com/example/roblectric
/**
*Robolectric使用名为Test的类作为应用程序的测试变体
*我们使用测试应用程序进行API类注入,所以我们需要这个类的测试版本。
*/
公共类TestYourApplication扩展了YourApplication{
...
}

日志中是否有任何可能有用的内容?是否有错误、警告?是否尝试使用--info或--debug运行以获得更详细的输出?此外,如果尝试从AS运行整个套件,而不是仅此一个测试,它是否也能正常工作?