package org.peerbox.guice; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; import java.io.IOException; import java.lang.reflect.Field; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.stage.Stage; import org.junit.BeforeClass; import org.junit.Test; import org.mockito.Mockito; import org.peerbox.app.AppContext; import org.peerbox.app.manager.user.IUserManager; import org.peerbox.helper.JavaFxNoOpApp; import org.peerbox.presenter.LoginController; import org.peerbox.presenter.MainController; import org.peerbox.presenter.NavigationService; import org.peerbox.view.ViewNames; import com.google.inject.Guice; import com.google.inject.Injector; public class GuiceFxmlLoaderTest { @BeforeClass public static void initJFX() { Thread t = new Thread("JavaFX Init Thread") { public void run() { if(!JavaFxNoOpApp.isInitialized()) { Application.launch(JavaFxNoOpApp.class, new String[0]); } } }; t.setDaemon(true); t.start(); } @Test(expected = IllegalArgumentException.class) public void testGuiceFxmlLoader() { new GuiceFxmlLoader(null); } @Test public void testCreateLoginViewDependencies() throws Exception { /* simple injector */ Injector injector = Guice.createInjector( new AppModule(Mockito.mock(Stage.class)), new AppConfigModule(), new ApiServerModule() ); IFxmlLoaderProvider fxmlLoaderProvider = new GuiceFxmlLoader(injector); FXMLLoader fxmlLoader = fxmlLoaderProvider.create(ViewNames.LOGIN_VIEW); Parent loginView = fxmlLoader.load(); Object loginController = fxmlLoader.getController(); assertNotNull(loginView); assertNotNull(loginController); assertTrue(loginController instanceof LoginController); /** * Check whether the factory for controller instantiation works and uses Guice to * resolve dependencies */ Class<?> ctrl = loginController.getClass(); /* context */ Field appContextField = ctrl.getDeclaredField("appContext"); appContextField.setAccessible(true); Object appContext = appContextField.get(loginController); assertNotNull(appContext); assertTrue(appContext instanceof AppContext); /* user manager */ Field userManagerField = ctrl.getDeclaredField("userManager"); userManagerField.setAccessible(true); Object userManager = userManagerField.get(loginController); assertNotNull(userManager); assertTrue(userManager instanceof IUserManager); /* navigation service */ Field navigationServiceField = ctrl.getDeclaredField("fNavigationService"); navigationServiceField.setAccessible(true); Object navigationService = navigationServiceField.get(loginController); assertNotNull(navigationService); assertTrue(navigationService instanceof NavigationService); } @Test public void testCreateMainViewMock() throws IOException { Injector injector = Mockito.mock(Injector.class); when(injector.getInstance(MainController.class)).thenReturn(new MainController()); IFxmlLoaderProvider fxmlLoaderProvider = new GuiceFxmlLoader(injector); FXMLLoader fxmlLoader = fxmlLoaderProvider.create(ViewNames.MAIN_VIEW); Parent mainView = fxmlLoader.load(); Object mainController = fxmlLoader.getController(); assertNotNull(mainView); assertNotNull(mainController); // getInstance called to get a controller instance? Mockito.verify(injector, Mockito.times(1)).getInstance(MainController.class); } @SuppressWarnings("unused") @Test(expected = IOException.class) public void testCreateNoName() throws IOException { Injector injector = Guice.createInjector(); IFxmlLoaderProvider fxmlLoaderProvider = new GuiceFxmlLoader(injector); FXMLLoader fxmlLoader; fxmlLoader = fxmlLoaderProvider.create(""); Parent mainView = fxmlLoader.load(); /* should throw exception */ Object mainController = fxmlLoader.getController(); } }