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?

Était-ce utile?

La 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top