I am running JUnit tests using Robolectric. I am trying to test an Activity that has injected members. I am able to get my test class to Inject its own member correctly. But Still can't inject mocks into my Activity members.
I tried
@Inject LoginActivity loginActivity;
Also tried
LoginActivity activity = new LoginActivity();
injector.injectMembers(activity);
My Tests
@RunWith(RobolectricTestRunner.class)
public class LoginActivityTest {
protected Injector injector;
// This get injected correctly
@Inject
protected IServiceClient serviceClient;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
RoboGuice.setBaseApplicationInjector(Robolectric.application, RoboGuice.DEFAULT_STAGE, new MobileTestModule());
injector = RoboGuice.getBaseApplicationInjector(Robolectric.application);
injector.injectMembers(this);
LoginActivity activity = new LoginActivity();
// This fails
injector.injectMembers(activity);
}
@After
public void tearDown() {
}
My DI Module
public class MobileTestModule extends AbstractModule {
@Override
protected void configure() {
// Services
bind(IServiceClient.class).toInstance(Mockito.mock(IServiceClient.class));
// Other binding here
}
}
EDIT
Here is the exception that I'm getting
com.google.inject.ConfigurationException: Guice configuration errors:
1) No implementation for android.content.Context was bound.
while locating android.content.Context
for parameter 0 at com.company.app.helpers.SlideMenuAdapter.<init>(Unknown Source)
while locating com.company.app.helpers.SlideMenuAdapter
for field atcompanycom.company.atlasmobile.helpers.AtlasPhoneActivity.slideMenuAdapter(Unknown Source)
while locating com.company.app.pages.login.LoginActivity
for field at com.company.app.test.LoginActivityTest.loginActivity(Unknown Source)
while locating com.company.app.test.LoginActivityTest
2) No scope is bound to roboguice.inject.ContextSingleton.
at roboguice.inject.ContentViewListener.class(Unknown Source)
while locating roboguice.inject.ContentViewListener
for field at roboguice.activity.RoboActivity.ignored(Unknown Source)
while locating com.nuvasive.atlasmobile.pages.login.LoginActivity
for field at com.nuvasive.atlasmobile.test.LoginActivityTest.loginActivity(Unknown Source)
while locating com.company.app.test.LoginActivityTest
Here is how you setup RoboGuice with Robolectric, and force injection on test class members.
// Setup Module
RoboGuice.setBaseApplicationInjector(Robolectric.application, RoboGuice.DEFAULT_STAGE, Modules.override(RoboGuice.newDefaultRoboModule(Robolectric.application)).with(new MyModule()));
// Get an Injector instance
injector = RoboGuice.getInjector(Robolectric.application);
// Inject properties on test class members (Marked with @Inject)
injector.injectMembers(this);
Here is how you initialize an activity when using Robolectric
LoginActivity activity = Robolectric.buildActivity(LoginActivity.class).create().get();