2017-11-14 18 views
2

私はスクリーンショットを生成したクラスがあります:で作成SpringBootでawt。*をテストするには?

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

マイアプリを、私はそれをテストする必要があります。しかし、私は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)); 
    } 
} 

私はHeadlessExceptionを防ぐために試してみてください。

@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を使用しています。

しかし、それは役に立たなかった。

org.robinhood.image.ImagesHandlerImpl.doScreen(ImagesHandlerImpl.java:42)で sun.awt.HeadlessToolkit.getScreenSize(HeadlessToolkit.java:284)でava.awt.HeadlessException :私は、ログ取得します でorg.robinhood.image.ImagesHandlerImplTest.whenDoScreenThenCreatePrintScreen(ImagesHandlerImplTest.java:51) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) で でsun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)でsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at j (FrameworkMethod.java:50) at org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model。 org.junit.internal.runners.statements.InvokeMethod.evaluate(は、invokeMethodでReflectiveCallable.run(ReflectiveCallable.java:12) でorg.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 。 Javaの: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で) で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。Javaの:70) org.junit.runners.ParentRunner.run(ParentRunner.java:363)で org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)org.junitで で。 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.prepareStreamsAndStart(JUnitStarter.java:242) com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70で)

私を助けてください。この問題を解決するには? ありがとうございました!

答えて

1

スプリングテストランナーmain methodApp classと呼びます。 デフォルトではHeadless modeが有効になります。

テストケースの実行には、JVM引数-Djava.awt.headless=falseを指定できます。 もう1つの解決策は、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 { 
    //... 
    } 
} 
+0

それは役に立たなかった。私は同じ結果を得る。 'SpringApplicationBuilder builder =新しいSpringApplicationBuilder(Application.class); builder.headless(true).run(args); ' – Pavel

+0

私の更新された回答を確認してください。 –

関連する問題