Можно ли протестировать 2 окна javafx одновременно с testfx? - PullRequest
0 голосов
/ 12 сентября 2018

Я создаю проект чата с использованием 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 приложения одновременно?

спасибо

EDIT Я частично решил этот вопрос, издеваясь над классом окна с помощью mockito.

...