I haven't the answer for the Application overriding but I propose a solution for your broader goal:
|-- src
| +-- debug
| +-- java
| +-- mypackage
| +-- Modules.java
| +-- MockModule.java
| +-- main
| +-- java
| +-- mypackage
| +-- MainModule.java
| +-- release
| +-- java
| +-- mypackage
| +-- Modules.java
src/debug/java/mypackage/Modules.java
public final class Modules {
public static List<Object> getModules(App application) {
ArrayList<Object> modules = new ArrayList<Object>();
modules.add(new MainModule(application));
modules.add(new MockModule());
return modules;
}
}
src/debug/java/mypackage/MockModule.java
@Module(
overrides = true,
library = true,
injects = { MainActivity.class })
public class MockModule {
@Provides MyType buildMock() {
return //...
}
}
src/release/java/mypackage/Modules.java
public final class Modules {
public static List<Object> getModules(App application) {
ArrayList<Object> modules = new ArrayList<Object>();
modules.add(new MainModule(application));
return modules;
}
}
src/main/java/mypackage/App.java
public class App extends Application {
private ObjectGraph graph;
@Override public void onCreate() {
super.onCreate();
graph = ObjectGraph.create(Modules.getModules(this).toArray());
}
public void inject(Object object) {
graph.inject(object);
}
}
Let me know if it works for you.
This technique was presented by Jake Wharton in his Android Apps with Dagger presentation