我正在使用带有 JavaFX 的 Spring Boot 进行测试(基于一些解释这一点的优秀 YouTube 视频)。
为了使它与TestFX一起工作,我需要创建这样的上下文:
@Override
public void init() throws Exception {
SpringApplicationBuilder builder = new SpringApplicationBuilder(MyJavaFXApplication.class);
builder.headless(false); // Needed for TestFX
context = builder.run(getParameters().getRaw().stream().toArray(String[]::new));
FXMLLoader loader = new FXMLLoader(getClass().getResource("main.fxml"));
loader.setControllerFactory(context::getBean);
rootNode = loader.load();
}
我现在想测试这个 JavaFX 应用程序,为此我使用:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class MyJavaFXApplicationUITest extends TestFXBase {
@MockBean
private MachineService machineService;
@Test
public void test() throws InterruptedException {
WaitForAsyncUtils.waitForFxEvents();
verifyThat("#statusText", (Text text ) -> text.getText().equals("Machine stopped"));
clickOn("#startMachineButton");
verifyThat("#startMachineButton", Node::isDisabled);
verifyThat("#statusText", (Text text ) -> text.getText().equals("Machine started"));
}
}
这将启动一个 Spring 上下文并按预期用模拟 bean 替换“普通”bean。
但是,我现在得到了一个java.awt.HeadlessException
,因为这个“无头”属性没有设置为 false,就像在正常启动期间完成的那样。如何在测试期间设置此属性?
编辑:
仔细看,似乎启动了 2 个上下文,一个是 Spring 测试框架启动的,一个是我在init
方法中手动创建的,因此被测应用程序没有使用模拟的 bean。如果有人知道如何在init()
方法中获取测试上下文引用,我会很高兴。