You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用@TestInstance(PER_CLASS)仍重复执行TestFX的start方法如何解决?

解决TestFX中@Start方法重复执行的问题

问题原因

TestFX的ApplicationExtension默认会为每个测试方法单独启动JavaFX应用实例,即使设置了@TestInstance(TestInstance.Lifecycle.PER_CLASS)也不会改变这个行为——因为@Start注解是由ApplicationExtension专门处理的,它的生命周期绑定到测试方法而非测试类。

解决方案

改用@BeforeAll替代@Start,手动初始化JavaFX环境和应用界面,这样在PER_CLASS模式下只会执行一次初始化:

修改后的测试代码

package guitest;

import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.extension.ExtendWith;
import org.testfx.api.FxAssert;
import org.testfx.framework.junit5.ApplicationExtension;
import org.testfx.matcher.control.LabeledMatchers;
import org.testfx.api.FxToolkit;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@ExtendWith(ApplicationExtension.class)
public class DemoTest {

    private Button button;
    int counter = 0;
    private Stage stage;

    @BeforeAll
    public void setupApplication() throws Exception {
        // 手动初始化JavaFX并启动应用
        FxToolkit.registerPrimaryStage();
        stage = FxToolkit.setupStage(stage -> {
            button = new Button("click me!");
            counter++;
            stage.setScene(new Scene(new StackPane(button), 100, 100));
            stage.show();
        });
    }

    @AfterAll
    public void cleanupApplication() throws Exception {
        // 测试结束后清理JavaFX资源
        FxToolkit.cleanupStages();
    }

    @Test @Order(1)
    void firstTest(){
        Assertions.assertNotNull(button);
    }

    @Test @Order(2)
    void secondTest(){
        FxAssert.verifyThat(".button", LabeledMatchers.hasText("click me!"));
    }

    @Test @Order(3)
    void seeCounter(){
        Assertions.assertEquals(1, counter);
    }
}

关键说明

  • @BeforeAll在PER_CLASS模式下仅执行一次,彻底解决重复初始化导致的测试缓慢问题。
  • 使用FxToolkit.setupStage()手动创建并配置Stage,替代@Start的自动初始化逻辑。
  • 必须添加@AfterAll调用FxToolkit.cleanupStages(),避免JavaFX资源泄漏,保证测试环境的干净性。

内容的提问来源于stack exchange,提问作者Harold

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 12:11:00