You hit a nail on the head, saying:
The component has no input methods for my test classes.
So, to get around this problem, we can make a test version of your Application class. Then we can have a test version of your module. And for all this to be done in the test, we can use Robolectric.
1) Create a test version of the Application class
public class TestPipeGameApp extends PipeGameApp { private PipeGameModule pipeGameModule; @Override protected PipeGameModule getPipeGameModule() { if (pipeGameModule == null) { return super.pipeGameModule(); } return pipeGameModule; } public void setPipeGameModule(PipeGameModule pipeGameModule) { this.pipeGameModule = pipeGameModule; initComponent(); }}
2) In your source application class there must be initComponent () and pipeGameModule () methods
public class PipeGameApp extends Application { protected void initComponent() { DaggerPipeGameComponent.builder() .pipeGameModule(getPipeGameModule()) .build(); } protected PipeGameModule pipeGameModule() { return new PipeGameModule(this); }}
3) Your PipeGameTestModule should extend the production module with the constructor:
public class PipeGameTestModule extends PipeGameModule { public PipeGameTestModule(Application app) { super(app); }}
4) Now, in your setup () junit method, install this test module in a test application:
@Before public void setup() { TestPipeGameApp app = (TestPipeGameApp) RuntimeEnvironment.application; PipeGameTestModule module = new PipeGameTestModule(app); app.setPipeGameModule(module); }
Now you can configure your test module as you like.
Igor Ganapolsky Apr 04 '16 at 0:45 2016-04-04 00:45
source share