当前位置: 首页 > 知识库问答 >
问题:

如何用springboot测试AWT.*?

唐永春
2023-03-14

我有一个生成屏幕截图的类:

@Component
public class ImagesHandlerImpl implements ImagesHandler {
    ....
    public boolean doScreen() throws IOException, AWTException {
        final Rectangle rectangle = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
        ...
    }
}

我的应用程序是用spring boot创建的,我需要对它进行测试。但我得到java.awt.HeadlessException

我的测试:

@RunWith(SpringRunner.class) 
@SpringBootTest(classes = ImagesHandlerImpl.class) 
@ContextConfiguration(classes = App.class) 
public class ImagesHandlerImplTest { 
    ...
    @Test
    public void whenDoScreenThenFilenameLikeTemplate() throws IOException, AWTException {
        imagesHandler.doScreen();
        final String name = dir.listFiles()[0].getName();
        assertThat("SCREEN_0", is(name));
    }
}

我试图防止无头异常:

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplicationBuilder builder = new SpringApplicationBuilder(App.class);
        builder.headless(false).run(args);
    }
}

我使用的是spring启动版本1.5.6。

但这无济于事。我得到日志:

java.awt.HeadlessException在sun.awt.HeadlesStoolKit.GetScreenSize(headlesStoolKit.java:284)在org.robinhood.image.imagesHandlerImpl.doScreen(imagesHandlerImpl.java:42)在org.robinhood.image.imagesHandlerImpl.whendoScreenEncreatePrintScreen(imagesHandlerImpl.java:51)在sun.reflect.nativeMethodAccessorImpl.Invoke0(ate(RunBeForestMethodCallbacks.Java:75)在org.springframework.test.context.junit4.statements.runAfterTestMethodCallbacks.evalue(RunAfterTestMethodCallbacks.Java:86)在org.springframework.test.context.junit4.statements.springrepeat.evalue(SrunAfterTestMethodCallbacks.84)在xt.junit4.statements.runbeForestClassCallbacks.evaluate(RunbeForestClassCallbacks.Java:61)在org.junit.internal.runners.statements.runafters.evaluate(Runafters.Java:27)在org.springframework.test.context.junit4.statements.runaftertestClassCallbacks.evaluate(Runafters.Java:27)在

帮帮我.如何解决此问题?谢谢!

共有2个答案

伊飞光
2023-03-14

添加

// overcome @SpringBootTest setup
System.setProperty("java.awt.headless", "false")

doscreen()方法调用之前。

柯锋
2023-03-14

spring测试运行程序不调用app classmain method。并且它会在默认情况下开启无头模式。

您可以指定用于执行测试用例的JVM参数-djava.awt.headless=false。另一个解决方案是在bean初始化期间设置属性。

@Component
public class ImagesHandlerImpl implements ImagesHandler, InitializingBean {
  @Override
  public void afterPropertiesSet() throws Exception {
    System.setProperty("java.awt.headless", "false");
  }

  public boolean doScreen() throws Exception {
    //...
  }
}
 类似资料:
  • 我有以下测试: 这是好的,它可以运行,但是我想知道有没有一种方法可以将它作为单元测试而不是集成测试运行,并且仍然使用@mockbean@autowired。还是我错过了什么? 我试着只保留@ExtendWith(SpringExtension.class),但我得到一个关于找不到BookServiceImpl bean的异常。 我知道如何使用MockitoExtension和@mock、@inje

  • 因此,我正在进行我的第一个Spring Boot项目,我一直在进行测试。我查了很多例子,但似乎都不管用。 这是我的控制器的当前测试: 这是可行的,但在sonarqube上,我发现我的代码覆盖率为0%,而我似乎找不到一个测试,它的覆盖率甚至超过了零。有谁能给我一个关于如何为控制器编写一个好的单元测试的例子,然后我就可以根据您的例子自己解决这个问题。 这是我的控制器: 这是我的服务(以防您需要): 还

  • 我有几个繁重的Spring集成测试(是的,这不是最好的方法,我没有时间正确地模拟所有外部dep) 下面是测试的典型注释 由于以下原因,测试会定期失败: 这里有两个问题:1、让测试共存的正确方式是什么?我在surefire插件中设置了forkCount=0。好像有帮助 2.1. 在每次测试期间,我实际上不需要启动所有的

  • 与@mockbean和@spybean一样,有没有类似于@fakebean/@dummybean的东西? 其思想是,该实例是100%真实的(具有预期的生产内部状态),并且它覆盖(或者添加bean,以防在配置中没有声明)上下文中的bean。理想情况下,您不需要创建TestConfiguration类并将其设置为Primary,因为这样可以在每个测试的基础上控制假冒,只有在需要时才可以。否则它使用主的