我想实现一个自定义的 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/

10-11 03:46