我有一个简单的 JavaFx 应用程序(Java 8),它使用 TestFx 进行了单元测试。但是,当测试运行时,应用程序窗口会启动,并且鼠标会移动以执行我的测试中的任何操作。这些测试能否以不弹出应用程序的方式运行,并且在自动构建和测试正在运行时,我仍然可以将鼠标用于其他事情?
3 回答
更新:
我发现这篇博文为我提供了解决这个问题的方法。正如作者建议的那样,您需要在构建中添加以下依赖项:
testRuntime 'org.testfx:openjfx-monocle:1.8.0_20'
然后,您需要在调用之前在某处包含以下内容,在我的情况下,在我使用 JUnit 时registerPrimaryStage()
标记为的方法中:@BeforeClass
System.setProperty("testfx.robot", "glass");
System.setProperty("testfx.headless", "true");
System.setProperty("prism.order", "sw");
System.setProperty("prism.text", "t2k");
我还要补充一点,包括它有助于System.setProperty("java.awt.headless", "true")
确保您不依赖 AWT 中的任何内容(在我的情况下,我有一个电话来获取导致问题的屏幕大小)。我还按照博客作者的建议添加了一个开关来打开和关闭无头模式。这给出了最终方法如下:
@BeforeClass
public static void setupSpec() throws Exception {
if (Boolean.getBoolean("headless")) {
System.setProperty("testfx.robot", "glass");
System.setProperty("testfx.headless", "true");
System.setProperty("prism.order", "sw");
System.setProperty("prism.text", "t2k");
System.setProperty("java.awt.headless", "true");
}
registerPrimaryStage();
}
您可以在此处查看上下文中的解决方案
原答案:
如果您使用的是 Linux,则可以为此使用 xvfb。在基于 Debian 的系统上,您可以按如下方式安装 xvfb:
$ sudo apt-get install xvfb
安装 xvfb 后,在运行测试之前运行以下命令:
$ Xvfb :99 &>/dev/null &
$ export DISPLAY=:99
如果您在同一个控制台中启动测试,TestFX 将使用帧缓冲区而不是您的主显示器。因此测试将运行,但您不会被打开窗口和移动鼠标指针所困扰。
我同意 KDK 使用 Monocle,因为它对 Jenkins 确实很有魅力。我无法从 Jenkins 上的 Xvfb 获得可靠的结果。以下是我采取并为我工作的步骤。
准备单片眼镜
你想从Monocle Github下载 Monocle 。看起来有 api 变化,所以你想编辑 MonocleView.java 并在下载后添加以下方法。我不确定我应该在该方法中添加什么,但发现它没有实现它就可以工作。
@Override
protected int _getNativeFrameBuffer(long ptr) {
// TODO Auto-generated method stub
return 0;
}
安装单片眼镜
构建 Monocle jar 并将 jar 放入您的 JRE(在 jre/lib/ext 路径下)
使用 Glass lib 运行 Monocle
下面是我在 jenkins 中使用的 maven 命令,您将对 java 运行时选项部分感兴趣。
$ mvn clean install -Dtestfx.robot=glass -Dglass.platform=Monocle -Dmonocle.platform=Headless -Dprism.order=sw
是的,可以对 JavaFx2 应用程序执行无头测试。您将需要 Monocle(OpenJFX 的一部分)。更多细节在这里: https ://github.com/TestFX/Monocle