2017-11-14 3 views
2

나는 스크린 샷을 생성하는 클래스가 있습니다 spring boot로 만든SpringBoot에서 awt. *를 테스트하는 방법은 무엇입니까?

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

내 응용 프로그램을, 나는 그것을 테스트해야합니다.

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

내가 봄 부팅 버전 1.5.6.RELEASE를 사용 : 나는 모두 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)); 
    } 
} 

:하지만 java.awt.HeadlessException

내 테스트를 얻을.

하지만 도움이되지 않았습니다.

org.robinhood.image.ImagesHandlerImpl.doScreen (ImagesHandlerImpl.java:42)에서 sun.awt.HeadlessToolkit.getScreenSize (HeadlessToolkit.java:284)에서 ava.awt.HeadlessException : 나는 로그 수 에서 sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)에서 sun.reflect.NativeMethodAccessorImpl.invoke0 (기본 방법) 에서 org.robinhood.image.ImagesHandlerImplTest.whenDoScreenThenCreatePrintScreen (ImagesHandlerImplTest.java:51) 에서 sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) at j org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:50) at org.junit.runners.model.avan.lang.reflect.Method.invoke ReflectiveCallable.run org.junit.internal.runners.statements.InvokeMethod.evaluate에서 org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:47) 에서 (ReflectiveCallable.java:12) (InvokeMethod. 자바 17) org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate (RunBeforeTestMethodCallbacks.java:75) 에서 org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate (RunAfterTestMethodCallbacks에서 된 .java : 86) org.springframework.test.context.junit4.statements.SpringRepeat.evaluate (SpringRepeat.java:84 AT)에서 org.junit.runners.ParentRunner.runLeaf (ParentRunner.java:325)에서 org.junit.runners에서 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild (SpringJUnit4ClassRunner.java:94)에서 (SpringJUnit4ClassRunner.java:252) .ParentRunner $ 3.run (ParentRunner.java:290) at org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren (ParentRunner.java:288) at org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) at org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.java:268) at org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:26) at org.springframework.test.context org.springframework.test.context.junit4에서 .junit4.statements.RunBeforeTestClassCallbacks.evaluate org.junit.internal.runners.statements.RunAfters.evaluate (RunAfters.java:27)에서 (RunBeforeTestClassCallbacks.java:61) .statements.RunAfterTestClassCallbacks.evaluate (RunAfterTestClassCallbacks.자바 : org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run (SpringJUnit4ClassRunner.java:191) org.junit에서 에서 org.junit.runners.ParentRunner.run (ParentRunner.java:363) 70) . com.intellij.rt.execution.junit.IdeaTestRunner $ Repeater.startRunnerWithArgs에서 com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs (JUnit4IdeaTestRunner.java:68) 에서 runner.JUnitCore.run (JUnitCore.java:137) (IdeaTestRunner 된 .java 47) com.intellij.rt.execution.junit.JUnitStarter.main에서 com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart (JUnitStarter.java:242)에서 (JUnitStarter.java:70)

도와주세요. 이 문제를 해결하는 방법? 감사합니다!

답변

1

스프링 테스트 러너 main methodApp class으로 불러옵니다. 그리고 기본적으로 Headless mode을 켭니다.

테스트 사례를 실행하기 위해 JVM 인수 -Djava.awt.headless=false을 지정할 수 있습니다. 또 다른 해결책은 빈 초기화 중에 속성을 설정하는 것입니다.

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

    public boolean doScreen() throws Exception { 
    //... 
    } 
} 
+0

도움이되지 않았습니다. 나는 같은 결과를 얻는다. 'SpringApplicationBuilder 빌더 = 새로운 SpringApplicationBuilder (Application.class); builder.headless (true) .run (args); ' – Pavel

+0

업데이트 된 답변을 확인하십시오. –