Можно ли протестировать 2 окна javafx одновременно с testfx?
Я создаю проект чата с использованием java, javafx, testfx и веб-сокетов для java API. Мои тесты работают нормально, но я создал новый тест, который застрял у меня; Этот новый тест будет о реализации связи между сервером и клиентом. Во всяком случае, я не должен объяснять вам протокол, проблема не в этом. Проблема в том, что мне нужно создать и запустить приложение дважды: одно для первого приложения (которое будет сервером), а второе - для клиента.
Но testfx, кажется, предназначен для тестирования одного окна javafx в то время, и с некоторыми методами, такими как "find(String)", он действует так, как если бы это было реальное окно. Это то, что я думаю, я понял. Я покажу вам мой код (который не работает из-за моих попыток запустить 2 окна одновременно), но прежде я хотел бы получить следующее: я создаю два класса ApplicationRunner (цель ApplicationRunner - управлять приложением, включая "main"метод), каждый из которых содержит свою переменную FenetreMig (= окно). И тесты запрашивают, например, apr.fenetre.lbl_state.getGraphic(), чтобы получить изображение метки lbl_state окна, содержащегося в экземпляр ApplicationRunner с именем apr.
Вот (грязный) код моего тестового класса (не стесняйтесь спрашивать меня для получения более подробной информации, если это необходимо):
package lorry;
import javafx.application.Platform;
import javafx.scene.Node;
import javafx.scene.control.Label;
import lorry.GraphicUtilities.FenetreMig;
import org.junit.jupiter.api.*;
import org.mockito.MockitoAnnotations;
import org.testfx.api.FxRobot;
import org.testfx.api.FxToolkit;
import java.util.concurrent.TimeoutException;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.testfx.api.FxAssert.verifyThat;
import static org.testfx.util.NodeQueryUtils.hasText;
//@ExtendWith(MockitoExtension.class)
public class unitTestsTry2 {
private static final String LOCAL_IP = "127.0.0.1";
private static final String REMOTE_IP = "127.0.0.1";
private static final String LOCAL_PORT = "1001";
private static final String REMOTE_PORT = "1002";
static ApplicationRunner apr;
@BeforeAll
static void before() throws Exception {
FxToolkit.registerPrimaryStage();
//getApplicationRunnerWithGUI();
MockitoAnnotations.initMocks(unitTestsTry2.class);
}
private ApplicationRunner getApplicationRunnerWithGUI(String LO_IP, String LO_PORT, String RE_IP, String RE_PORT) {
ApplicationRunner local_apr = getApplicationRunner(LO_IP, LO_PORT, RE_IP, RE_PORT);
try {
FxToolkit.setupApplication(FenetreMig.class);
} catch (TimeoutException e) {
e.printStackTrace();
}
//the following call waits for the constructor to be called and the window's variables to be filled
local_apr.fenetre = FenetreMig.waitForFenetreMig();
//new Thread(apr.fenetre).start();
//testWindow.waitUntilInjections();
local_apr.fenetre.lbl_state = find("#lbl_state");
local_apr.fenetre.txf_insert = find("#txf_insert");
local_apr.fenetre.txa_lines = find("#txa_lines");
local_apr.fenetre.btn_quit = find("#btn_quit");
local_apr.fenetre.btn_send = find("#btn_send");
return local_apr;
}
private ApplicationRunner getApplicationRunner(String LO_IP, String LO_PORT, String RE_IP, String RE_PORT) {
return ApplicationRunner.createAndInitializeExceptWindow(new String[]{LO_IP,LO_PORT,RE_IP,RE_PORT});
}
@Test
void oneTest() {
apr = getApplicationRunnerWithGUI(LOCAL_IP,LOCAL_PORT,REMOTE_IP,REMOTE_PORT);
//verifyThat("#btn_send", hasText("Envoyer"));
Platform.runLater(() -> assertEquals(apr.fenetre.btn_send.getText(), "Envoyer"));
}
@Test
void end2_startupAloneStateRedThenYellow() {
apr=getApplicationRunnerWithGUI(LOCAL_IP,LOCAL_PORT,REMOTE_IP,REMOTE_PORT);
apr.tryToConnect();
assertEquals(((Label) find("#lbl_state")).getGraphic(), FenetreMig.WAITING);
}
@Test
void StartupClientTriesAndSucceedsToConnect() { <--------
ApplicationRunner app_server = getApplicationRunnerWithGUI(LOCAL_IP, LOCAL_PORT, REMOTE_IP, REMOTE_PORT);
app_server.tryToConnect();
ApplicationRunner app_client = getApplicationRunnerWithGUI(REMOTE_IP, REMOTE_PORT, LOCAL_IP, LOCAL_PORT);
app_client.tryToConnect();
Platform.runLater(() -> assertEquals(app_server.fenetre.lbl_state.getGraphic(), FenetreMig.OK));
Platform.runLater(() -> assertEquals(app_client.fenetre.lbl_state.getGraphic(), FenetreMig.OK));
}
@Disabled
@Test
void startupAloneFailsAsClientThenRunServer() {
apr=getApplicationRunnerWithGUI(LOCAL_IP,LOCAL_PORT,REMOTE_IP,REMOTE_PORT);
apr.tryToConnect();
}
@Disabled
@Test
void ApplicationRunnerSessionWhenFilledThenGreen() {
}
@Disabled
@Test
void ApplicationRunnerSessionIfFilledAndAfterNullThenRedAndBeginConnectionsAsAtStartup() {
}
//**********************************************************************************************************
//**********************************************************************************************************
//**********************************************************************************************************
public <T extends Node> T find(final String query) {
/** TestFX provides many operations to retrieve elements from the loaded GUI. */
return new FxRobot().lookup(query).query();
}
@AfterEach
void tearDown() {
if (apr.server!=null) apr.server.stop();
}
@AfterAll
static void tearDownAll() throws TimeoutException {
FxToolkit.hideStage();
//release(new KeyCode[]{});
//release(new MouseButton[]{});
}
}
стрелка, которую я вставил в код, - это новый тест. Очевидно, такие заявления, как FxToolkit.setupApplication(FenetreMig.class);
исчезнет, если такая вещь возможна. Как вы думаете, можно ли протестировать 2 приложения одновременно?
благодарю вас
РЕДАКТИРОВАТЬ Я частично решил этот вопрос, издеваясь над классом окна с mockito.