Gradle 测试时 Java 图标抢焦点:给 AWT 测试 JVM 设置 UIElement
macOS 上运行涉及 AWT 的测试会出现 Java Dock 图标并抢走焦点。可只给对应 Test 任务的 JVM 增加 apple.awt.UIElement,保留真实 GUI 测试需求。
macOS 上后台运行 ./gradlew test,Java 图标突然出现在 Dock,键盘焦点从编辑器跳走。若测试初始化了 AWT,例如直接调用 Toolkit,或由 Apache POI 的字体测量间接触发,应检查测试 worker 的图形应用身份。
Gradle 9.1.0、macOS 15.5、OpenJDK 21.0.10 的具体组合有这个表现。测试进程虽然没有打开业务窗口,初始化 AWT 仍可能注册成普通 GUI 应用。这与测试断言失败、daemon 无法启动是不同问题。
参数加到 Test 任务的 JVM
对不需要作为前台 GUI 应用运行的测试,可在 Groovy build.gradle 中配置:
tasks.withType(Test).configureEach {
jvmArgs '-Dapple.awt.UIElement=true'
}
这会给本项目的 Test 子 JVM 增加参数。已有的堆大小、代理及其他 JVM 参数应保留。只改 org.gradle.jvmargs 主要影响 daemon,不能据此认定测试进程也得到了设置。
多模块工程需要在实际创建测试任务的项目或约定插件中配置。全局初始化脚本会扩大到其他构建,通常先在当前项目验证更容易确认影响范围。
apple.awt.UIElement 是 macOS 平台属性,目的是让这类进程以后台或辅助应用方式运行。它不等于 java.awt.headless=true:后者可能让屏幕、窗口等 AWT 操作直接不可用,不能随意互换来修复字体或图形测试。
保留真正的 GUI 测试语义
如果某些任务需要窗口激活、Dock 或键盘焦点,应只给普通测试任务设置该属性,保留 GUI 测试任务原行为。不要因为“测试时不再打断工作”就把所有图形交互验收都视为通过。
重新执行原来会初始化 AWT 的测试,观察新 worker 的启动参数、Dock 与焦点表现,并确认字体、图片或表格尺寸相关断言仍通过。普通不涉及 AWT 的测试成功,不足以覆盖这个触发条件。
保留局部构建配置方便撤回。这是可以显式配置的既有行为。该属性只作用于所配置的测试 JVM,不能据此承诺升级 Gradle 后默认不再抢焦点。


