How to test implementations of Guice AbstractModule?
Typically the best way to test Guice modules is to just create an injector in your test and ensure you can get instances of keys you care about out of it.
To do this without causing production stuff to happen you may need to replace some modules with other modules. You can use Modules.override
to selectively override individual bindings, but you're usually better off just not installing "production" type modules and using faked bindings instead.
Since Guice 4.0 there's a helper class BoundFieldModule
that can help with this. I often set up tests like:
public final class MyModuleTest {
@Bind @Mock DatabaseConnection dbConnection;
@Bind @Mock SomeOtherDependency someOtherDependency;
@Inject Provider<MyThing> myThingProvider;
@Before public void setUp() {
MockitoAnnotations.initMocks(this);
Guice.createInjector(new MyModule(), BoundFieldModule.of(this))
.injectMembers(this);
}
@Test public void testCanInjectMyThing() {
myThingProvider.get();
}
}
There's more documentation for BoundFieldModule
on the Guice wiki.
You can simply test a module implementation by creating the Injector
and then assert
the bindings by calling getInstance()
:
Injector injector = Guice.createInjector(new SomeModule());
assertNotNull(injector.getInstance(SomeSingleton.class));