@Test 注释不适用于 TestFX
@Test Annotiation not working with TestFX
我正在尝试在我的项目中实施 TextFX 以进行一些 UI 测试。但是,我似乎无法让它正常工作。我已将 jar 从 http://search.maven.org/#search%7Cga%7C1%7Ctestfx 下载到我系统上名为 'TestFX-3.1.2' 的文件夹中。
之后,我在 Netbeans8 中创建了一个指向这些 jar 文件(jar、源代码和 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 的新 class:
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 根本不起作用,并带有红色下划线和警告 'cannot find symbol'。谁能指出我做错了什么的正确方向?
根据 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 文件 class,因为它可能无法正常工作。而是以这种方式启动 main class:
FXTestUtils.launchApp(Test2.class);
Thread.sleep(2000);
controller = new GuiTest()
{
@Override
protected Parent getRootNode()
{
return Test2.getStage().getScene().getRoot();
}
};
在 Test2
class returns 舞台中创建一个 static
方法 getStage()
。上面的代码应该驻留在你的测试 class 中用 @BeforeClass
注释的方法中。控制器是对 GuiTest 的静态引用。
最后你的测试 class 应该看起来像这样:
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 进行扩展。而且,不要忘记在 Test2
class 中创建 static
getStage()
。希望这会有所帮助。这对我来说工作正常。
我正在尝试在我的项目中实施 TextFX 以进行一些 UI 测试。但是,我似乎无法让它正常工作。我已将 jar 从 http://search.maven.org/#search%7Cga%7C1%7Ctestfx 下载到我系统上名为 'TestFX-3.1.2' 的文件夹中。
之后,我在 Netbeans8 中创建了一个指向这些 jar 文件(jar、源代码和 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 的新 class:
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 根本不起作用,并带有红色下划线和警告 'cannot find symbol'。谁能指出我做错了什么的正确方向?
根据 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 文件 class,因为它可能无法正常工作。而是以这种方式启动 main class:
FXTestUtils.launchApp(Test2.class);
Thread.sleep(2000);
controller = new GuiTest()
{
@Override
protected Parent getRootNode()
{
return Test2.getStage().getScene().getRoot();
}
};
在 Test2
class returns 舞台中创建一个 static
方法 getStage()
。上面的代码应该驻留在你的测试 class 中用 @BeforeClass
注释的方法中。控制器是对 GuiTest 的静态引用。
最后你的测试 class 应该看起来像这样:
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 进行扩展。而且,不要忘记在 Test2
class 中创建 static
getStage()
。希望这会有所帮助。这对我来说工作正常。