kle*_*tra 5 java javafx testfx
在Eclipse photon和fx9或fx11中使用TestFX 4.0.14(无关紧要),来自TestFX Wiki 的简单示例测试失败了should_click_on_button(),
Expected: Labeled has text "clicked!"
but: was "click me!"
Run Code Online (Sandbox Code Playgroud)
当查看屏幕时,将显示窗格及其包含的按钮,但是鼠标会移动到其他地方:因此,永远不会单击该按钮,因此其文本也不会改变。
任何想法有什么问题/如何解决?
测试代码(为方便起见,全部从Wiki复制):
import org.junit.Test;
import org.testfx.framework.junit.ApplicationTest;
import static org.testfx.api.FxAssert.*;
import static org.testfx.matcher.control.LabeledMatchers.*;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
/**
* Simple testfx example from testfx wiki:
* https://github.com/TestFX/TestFX/wiki/Getting-Started
*
*/
public class ClickApplicationTest extends ApplicationTest {
@Override
public void start(Stage stage) {
Parent sceneRoot = new ClickApplication.ClickPane();
Scene scene = new Scene(sceneRoot, 100, 100);
stage.setScene(scene);
stage.show();
}
@Test
public void should_contain_button() {
// expect:
verifyThat(".button", hasText("click me!"));
}
@Test
public void should_click_on_button() {
// when:
clickOn(".button");
// then:
verifyThat(".button", hasText("clicked!"));
}
}
Run Code Online (Sandbox Code Playgroud)
应用代码:
import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
/**
* Simple testfx example from testfx wiki:
* https://github.com/TestFX/TestFX/wiki/Getting-Started
*
*/
public class ClickApplication extends Application {
// application for acceptance tests.
@Override public void start(Stage stage) {
Parent sceneRoot = new ClickPane();
Scene scene = new Scene(sceneRoot, 100, 100);
stage.setScene(scene);
stage.show();
}
// scene object for unit tests
public static class ClickPane extends StackPane {
public ClickPane() {
super();
Button button = new Button("click me!");
button.setOnAction(actionEvent -> button.setText("clicked!"));
getChildren().add(button);
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新:
在TestFX中发现了一个可能匹配的未解决问题。它提到了一个可能是原因的核心fx错误 -但似乎并非如此:它已在fx11中修复(已验证核心错误报告中的代码已通过),但testfx问题仍然存在..
结果发现是有几个原因的问题:
System.getProperties().put("testfx.robot", "glass"),必须在测试类启动之前执行此操作,即在由 @BeforeClass 注释的方法中(不在 @Before 或 @Before 中testApp.init())!否则,直接或间接涉及 mouseMove 的第一个测试将会失败,后续的测试就很好(让我困惑了一段时间,因为失败感觉是虚假的;)。样本:
public class ClickTest extends ApplicationTest {
@Test
public void testClick() {
verifyThat(".button", hasText("click me!"));
clickOn(".button");
verifyThat(".button", hasText("clicked!"));
}
/**
* Use glass robot.
* Note: this must happen once before the class is loaded. Otherwise,
* the very first test run uses the awt robot
*/
@BeforeClass
public static void config() throws Exception {
System.getProperties().put("testfx.robot", "glass");
}
@Override
public void start(Stage stage) {
Parent sceneRoot = new ClickPane();
Scene scene = new Scene(sceneRoot, 100, 100);
stage.setScene(scene);
stage.show();
}
// scene object for unit tests
public static class ClickPane extends StackPane {
public ClickPane() {
super();
Button button = new Button("click me!");
button.setOnAction(actionEvent -> button.setText("clicked!"));
getChildren().add(button);
}
}
@SuppressWarnings("unused")
private static final Logger LOG = Logger
.getLogger(ClickTest.class.getName());
}
Run Code Online (Sandbox Code Playgroud)