Spring Boot集成使用包含swing内容的config类测试HeadlessException

Ozi*_*ile 1 java spring spring-boot

我知道当弹出组件弹出时,Spring Boot在加载上下文时遇到问题.我在这里读到如何成功加载上下文.但是,集成测试怎么样?

MyApplicationTests.java

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MyApplication.class)
public class DemoApplicationTests {

@Test
public void contextLoads() {
}
}
Run Code Online (Sandbox Code Playgroud)

MyApplication.java

public static void main(String[] args) {
    try(ConfigurableApplicationContext context = new SpringApplicationBuilder
            (DesktopAppConfig.class)
            .headless(false).run(args)) {
    }
Run Code Online (Sandbox Code Playgroud)

DesktopAppConfig.java

@Configuration
public class DesktopAppConfig {

@Bean
public Object someBean() {
        JOptionPane.showMessageDialog(null, "message");
    return new Object();
    }
}
Run Code Online (Sandbox Code Playgroud)

这个简单的集成测试会抛出一个java.awt.HeadlessException,我无法在Spring Boot引用中找到任何通过集成测试将上下文设置为无头的方法.

And*_*son 5

您可以SpringApplication通过自定义自定义集成测试所使用的SpringApplicationContextLoader.您应该使用和属性来配置自定义上下文加载器,而不是使用@SpringApplicationConfiguration哪个配置使用默认值:SpringApplicationContextLoader@ContextConfigurationloader

@ContextConfiguration(classes = MyApplication.class, loader=CustomSpringApplicationContextLoader.class)
Run Code Online (Sandbox Code Playgroud)

在您的CustomSpringApplicationContextLoader实现中,覆盖getSpringApplication()并设置headlessfalse:

public class CustomSpringApplicationContextLoader extends SpringApplicationContextLoader {

    @Override
    protected SpringApplication getSpringApplication() {
        return new SpringApplicationBuilder().headless(false).build();
    }

}
Run Code Online (Sandbox Code Playgroud)