Guice and Mockito have very different and complementary roles, and I would say that they work best.
Consider this contrived class example:
public class CarController {
private final Tires tires = new Tires();
private final Wheels wheels = new Wheels(tires);
private final Engine engine = new Engine(wheels);
private Logger engineLogger;
public Logger start() {
engineLogger = new EngineLogger(engine, new ServerLogOutput());
engine.start();
engineLogger.recordEvent(ENGINE_STARTED);
return engineLogger;
}
}
, : , , : , , , , , . ?
DI-friendly:
public class CarController {
private final Engine engine;
private final Provider<Logger> loggerProvider;
private Logger engineLogger;
@Inject public Car(Engine engine, Provider<Logger> loggerProvider) {
this.engine = engine;
this.loggerProvider = loggerProvider
}
public Logger start() {
engineLogger = loggerProvider.get();
engine.start();
engineLogger.recordEvent(ENGINE_STARTED);
return engineLogger;
}
}
CarController , , , , , . , DI : Logger SnowTires RacingTires .
, : , FakeEngine DummyLogger, CarControllerTest. (, setter , , Guice. Guice .)
, : Guice, Mockito, Logger , :
public class FakeEngine implements Engine {
RuntimeException exceptionToThrow = null;
int callsToStart = 0;
Logger returnLogger = null;
@Override public Logger start() {
if (exceptionToThrow != null) throw exceptionToThrow;
callsToStart += 1;
return returnLogger;
}
}
Mockito, , :
@Mock Engine mockEngine;
verify(mockEngine).start();
doThrow(new RuntimeException()).when(mockEngine).start();
... . (CarController), (Tires, Wheels, ServerLogOutput) . Mockito , , .
: Guice, Mockito API, . Guice ; Mockito . , OO - .
, :
, Guice ; @Inject test doubles, . , , , , , , Mockito .
Mockito " " @InjectMocks, @Mock /, . mocks, , , , . , , DI, .