Skip to content

Instantly share code, notes, and snippets.

@vaughandroid
Last active March 11, 2020 20:49
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vaughandroid/2ac4aeb28d3e6b008fa4 to your computer and use it in GitHub Desktop.
Save vaughandroid/2ac4aeb28d3e6b008fa4 to your computer and use it in GitHub Desktop.
Not quite the easiest way to override Dagger 2 modules for unit tests...
@Component(modules=MyModule.class)
@ApplicationScope
public interface MyComponent {
void inject(MyApplication application);
}
@Module
public class MyModule {
@Provides @ApplicationScope
public String provideString() {
return "real string";
}
}
public class MyApplication extends Application {
@Inject public String injectedString;
private MyComponent component;
public void setComponent(MyComponent component) {
this.component = component;
component.inject(this);
Log.d("Injected: " + injectedString);
}
@Override
public void onCreate() {
super.onCreate();
if (component == null) {
setComponent(DaggerMyComponent.create());
}
}
}
public class MyActivityTest {
MyApplication app;
@Before
public void setUp() {
app = (MyApplication) getInstrumentation().getTargetContext().getApplicationContext();
// This is the sneaky bit. Create a partial mock of the Module you want to override,
// then just mock the provider methods you want to override.
MyModule module = Mockito.spy(new MyModule());
Mockito.doReturn("mocked string").when(module).provideString();
MyComponent component = DaggerMyComponent.builder()
.myModule(module)
.build();
app.setComponent(component);
}
@Test
public void mock_injected_successfully() {
assertEquals("mocked string", app.injectedString);
}
}
@vaughandroid
Copy link
Author

I've posted a new gist here using @tbroyer's idea: https://gist.github.com/vaughandroid/00287633102af6a66dc8

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment