package tutorial_1_server.testing; import com.google.guiceberry.GuiceBerryEnvMain; import com.google.guiceberry.GuiceBerryModule; import com.google.guiceberry.TestId; import com.google.guiceberry.TestScoped; import com.google.guiceberry.controllable.IcMaster; import com.google.guiceberry.controllable.StaticMapInjectionController; import com.google.guiceberry.controllable.TestIdServerModule; import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.google.inject.Key; import com.google.inject.Module; import com.google.inject.Provides; import com.google.inject.Singleton; import org.openqa.selenium.Cookie; import org.openqa.selenium.WebDriver; import org.openqa.selenium.htmlunit.HtmlUnitDriver; import tutorial_1_server.prod.PetStoreServer; import tutorial_1_server.prod.Pet; import tutorial_1_server.prod.Featured; public final class PetStoreEnv4InjectionController extends AbstractModule { @Provides @Singleton @PortNumber int getPortNumber() { return FreePortFinder.findFreePort(); } @Provides @TestScoped WebDriver getWebDriver(@PortNumber int portNumber, TestId testId) { WebDriver driver = new HtmlUnitDriver(); driver.get("http://localhost:" + portNumber); driver.manage().addCookie(new Cookie(TestId.COOKIE_NAME, testId.toString())); return driver; } @Provides @Singleton PetStoreServer buildPetStoreServer(@PortNumber int portNumber) { PetStoreServer result = new PetStoreServer(portNumber) { @Override protected Module getPetStoreModule() { // !!! HERE !!! return icMaster.buildServerModule( new TestIdServerModule(), super.getPetStoreModule()); } }; return result; } private IcMaster icMaster; @Override protected void configure() { install(new GuiceBerryModule()); bind(GuiceBerryEnvMain.class).to(PetStoreServerStarter.class); // !!!! HERE !!!! icMaster = new IcMaster() .thatControls(StaticMapInjectionController.strategy(), Key.get(Pet.class, Featured.class)); install(icMaster.buildClientModule()); } private static final class PetStoreServerStarter implements GuiceBerryEnvMain { @Inject private PetStoreServer petStoreServer; public void run() { // Starting a server should never be done in a @Provides method // (or inside Provider's get). petStoreServer.start(); } } }