@Test Annotiation не работает с TestFX

Я пытаюсь реализовать TextFX в моем проекте, чтобы провести тестирование пользовательского интерфейса. Однако, похоже, я не могу заставить его работать должным образом. Я скачал фляги с http://search.maven.org/ в папку с именем "TestFX-3.1.2" в моей системе.

После этого я создал новую библиотеку в Netbeans8, указывающую на эти файлы jar (jar, source и javadoc). В качестве теста я создал простой проект Java FXML с добавленной новой библиотекой.

public class Test2 extends Application {

@Override
public void start(Stage stage) throws Exception {
    Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

    Scene scene = new Scene(root);

    stage.setScene(scene);
    stage.show();
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

}

Рядом с этим у меня есть контроллер для моего файла FXML со следующим сгенерированным кодом:

public class FXMLDocumentController implements Initializable {

@FXML
private Label label;

@FXML
private void handleButtonAction(ActionEvent event) {
    System.out.println("You clicked me!");
    label.setText("Hello World!");
}

@Override
public void initialize(URL url, ResourceBundle rb) {
    // TODO
}    

}

Для реализации стороны TestFX я создал новый класс, расширяющий GuiTest:

package test2;

import java.io.IOException;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import org.loadui.testfx.GuiTest;


public class TestTheThing extends GuiTest {

    @Override
    protected Parent getRootNode() {
        FXMLLoader loader = new FXMLLoader();
        Parent node = null;
        try {
            node = loader.load(this.getClass().getResource("FXMLDocument.fxml").openStream());
        } catch (IOException e) {
            System.out.println(e.toString());    
        }
        return node;
    }

    @Test //<-- this Annotiation does not work
    public void pressTheButton(){
        //TODO
    }
}

Как сказано выше в коде, @Test просто не работает и подчеркнут красным с предупреждением "не удается найти символ". Может ли кто-нибудь указать мне правильное направление о том, что я делаю неправильно?

2 ответа

Решение

Согласно https://repo1.maven.org/maven2/org/loadui/testFx/3.1.2/testFx-3.1.2.pom, testFx имеет несколько зависимостей (guava, junit, hamcrest-all, hamcrest-core). Для правильной работы вам необходимо добавить jar-файлы, соответствующие этим зависимостям, в ваш проект. Тем не менее, использование Maven является рекомендуемым подходом для этого.

Не загружайте ваш файл fxml непосредственно в тестовый класс, так как он может не работать намеренно. Вместо этого запустите основной класс следующим образом:

FXTestUtils.launchApp(Test2.class);
Thread.sleep(2000);

controller = new GuiTest()
    {
        @Override
        protected Parent getRootNode()
        {
            return Test2.getStage().getScene().getRoot();
        }
    };

Создать static метод getStage() в вашем Test2 класс, который возвращает этап. Приведенный выше код должен находиться в методе, помеченном как @BeforeClass в вашем тестовом классе. Контроллер является статической ссылкой на GuiTest.

В конце ваш тестовый класс должен выглядеть примерно так:

import java.io.IOException;

import javafx.scene.Parent;

import org.loadui.testfx.GuiTest;
import org.loadui.testfx.utils.FXTestUtils;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class TestTheThing
{
    public static GuiTest controller;

@BeforeClass
public static void setUpClass() throws InterruptedException, IOException
{
    FXTestUtils.launchApp(Test2.class);
    Thread.sleep(2000);
    controller = new GuiTest()
    {
        @Override
        protected Parent getRootNode()
        {
            return Test2.getStage().getScene().getRoot();
        }
    };  
}

@Test
public void testCase()
{
    System.out.println("in a test method");
}
}

В этом случае вам не нужно расширяться от GuiTest. И не забудьте создать staticgetStage() в Test2 учебный класс. Надеюсь, это поможет. Это работает нормально в моем случае.

Другие вопросы по тегам