A JUnit4 Method rule to perform injection on your test fixture before each test case:
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
import org.junit.rules.MethodRule;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;
public class PerTestGuiceRule implements MethodRule
{
private final Module module;
public PerTestGuiceRule(final Module module)
{
this.module = module;
}
@Override
public Statement apply(
final Statement base,
@SuppressWarnings("unused") final FrameworkMethod method,
final Object target)
{
return new Statement()
{
@Override
public void evaluate() throws Throwable
{
final Injector injector = Guice.createInjector(module);
injector.injectMembers(target);
base.evaluate();
}
};
}
} |
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
import org.junit.rules.MethodRule;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;
public class PerTestGuiceRule implements MethodRule
{
private final Module module;
public PerTestGuiceRule(final Module module)
{
this.module = module;
}
@Override
public Statement apply(
final Statement base,
@SuppressWarnings("unused") final FrameworkMethod method,
final Object target)
{
return new Statement()
{
@Override
public void evaluate() throws Throwable
{
final Injector injector = Guice.createInjector(module);
injector.injectMembers(target);
base.evaluate();
}
};
}
}
Use it by putting this code in you test fixture:
@Rule public PerTestGuiceRule guiceRule =
new PerTestGuiceRule(new MyModule());
@Inject MyInjectableType myInjectableType; |
@Rule public PerTestGuiceRule guiceRule =
new PerTestGuiceRule(new MyModule());
@Inject MyInjectableType myInjectableType;
You might want to check out GuiceBerry. I tried to use it, but for my case it seems very complex, or maybe impossible, to create your module per-test due to the static map of module class -> module instance used internally by guiceberry. There is a test scope included, but I don’t see a really clean way to use that if you want to test your production guice modules.