package guiceberry2_junit3.tutorial_1_server; import com.google.common.collect.Maps; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.Provides; import com.google.inject.Singleton; import com.google.inject.testing.guiceberry.GuiceBerryEnvMain; import com.google.inject.testing.guiceberry.TestId; import com.google.inject.testing.guiceberry.controllable.TestIdServerModule; import com.google.inject.testing.guiceberry.junit3.GuiceBerryJunit3Env; import guiceberry2_junit3.tutorial_1_server.prod.MyPetStoreServer; import guiceberry2_junit3.tutorial_1_server.prod.PetOfTheMonth; import guiceberry2_junit3.tutorial_1_server.prod.PortNumber; import org.openqa.selenium.Cookie; import org.openqa.selenium.WebDriver; import org.openqa.selenium.htmlunit.HtmlUnitDriver; import java.util.Map; public final class PetStoreEnv3CookiesControlledPotm extends GuiceBerryJunit3Env { @Provides @PortNumber int getPortNumber(MyPetStoreServer server) { return server.getPortNumber(); } @Provides WebDriver getWebDriver(@PortNumber int portNumber, TestId testId) { WebDriver driver = new HtmlUnitDriver(); // !!! HERE !!! driver.get("http://localhost:" + portNumber); driver.manage().addCookie( new Cookie(TestId.COOKIE_NAME, testId.toString())); return driver; } @Provides @Singleton MyPetStoreServer buildPetStoreServer() { MyPetStoreServer result = new MyPetStoreServer(8080) { @Override protected Module getPetStoreModule() { return new PetStoreModuleWithTestIdBasedOverride(); } }; return result; } @Override protected void configure() { super.configure(); bind(GuiceBerryEnvMain.class).to(PetStoreServerStarter.class); } private static final class PetStoreServerStarter implements GuiceBerryEnvMain { @Inject private MyPetStoreServer myPetStoreServer; public void run() { // Starting a server should never be done in a @Provides method // (or inside Provider's get). PetStoreModuleWithTestIdBasedOverride.serverInjector = myPetStoreServer.start(); } } public static final class PetStoreModuleWithTestIdBasedOverride extends MyPetStoreServer.PetStoreModule { private static Injector serverInjector; public static final Map<TestId, PetOfTheMonth> override = Maps.newHashMap(); // !!!HERE!!!! @Override protected PetOfTheMonth getPetOfTheMonth() { TestId testId = serverInjector.getInstance(TestId.class); PetOfTheMonth petOfTheMonth = override.get(testId); if (petOfTheMonth != null) { return petOfTheMonth; } return somePetOfTheMonth(); } @Override protected void configure() { super.configure(); install(new TestIdServerModule()); } } }