Question

I am currently upgrading robolectric from version 1 to 2. In my current version I use the following to provide the test module (for binding) to roboguice.

public class RoboTestRunner extends RobolectricTestRunner {

    public RoboTestRunner(Class<?> testClass) throws
            InitializationError {
        super(testClass);
    }

    @Override
    public void prepareTest(Object test) {
        Application app = Robolectric.application;
        RoboGuice.setBaseApplicationInjector(app, RoboGuice.DEFAULT_STAGE,
                Modules.override(RoboGuice.newDefaultRoboModule(app)).with(new
                        TestModule()));
        Injector injector = RoboGuice.getInjector(app);
        injector.injectMembers(test);
    }

}

However now I have upgraded the prepareTest method is not in this class. Where should I run this code in the new version?

UPDATE

I have found the way to do this. I need to create an class which extends android.app.Application in the project and reference this in the Manifest. Then I create a class like so

public class TestApplication extends Application implements TestLifecycleApplication {

    @Override
    public void onCreate() {
        super.onCreate();

        RoboGuice.setBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE,
                RoboGuice.newDefaultRoboModule(this), new TestModule());
    }

    @Override
    public void beforeTest(Method method) {}

    @Override
    public void prepareTest(Object test) {
        TestApplication application = (TestApplication) Robolectric.application;

        RoboGuice.setBaseApplicationInjector(application, RoboGuice.DEFAULT_STAGE,
                RoboGuice.newDefaultRoboModule(application), new TestModule());

        RoboGuice.getInjector(application).injectMembers(test);
    }

    @Override
    public void afterTest(Method method) {}

}

As this class has Test at the start robolectric should automatically find it and use it. However this doesn't seem to be happening. Does anybody know why?

UPDATE 2

This blog would suggest that the testmodule needs to be in the same package however I have all tests in a different package. How do I work around this?

Was it helpful?

Solution

Your TestApplication class should extend your own Application class, not android.app.Application, and it should be in the same package as your Application.

... however I have all tests in a different package.

That shouldn't be a problem. Put your TestApplication in your test module, but use the package from Application.

e.g., if you're using maven, the files would live here:

src/main/java/com/example/Application.java src/test/java/com/example/TestApplication.java

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top