2017-11-29 15 views
0

JUnitのテストケースとスイートをjarでパッケージ化し、JUnitコアを使ってJUnitコアをメインから実行しようとしています。問題は、JARでパッケージングした後にこれらのテストケースを実行すると、豆が注入されないことです(スプリングコンテキストの問題を意味します)。しかし、IDEからmainメソッドを実行すると、Jarでパッケージ化した後でSpringJUnit4ClassRunnerが動作しないが、IDEで動作する

これらのテストケースは、親クラスがスプリングコンテキストをロードしています。

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = { AppConfig.class }) 
public abstract class BaseTest { 

    @Autowired 
    protected WebDriver driver; 

    @PreDestroy 
    public void teardown() { 
     ... 
    } 
} 

テストクラスと

public class SomeTestClass extends BaseTest { 
    @Test 
    public void someTestCase() { 
     ... 
    } 
} 


@RunWith(Suite.class) 
@Suite.SuiteClasses({ 
    SomeTestClass.class 
}) 
public class SomeTestSuite { } 

suite-これらのテストケース/ JUnitCoreとスイートを実行するために使用されている主な方法があります。

public static void main(String...args) { 
     Result result = JUnitCore.runClasses(SomeTestSuite.class); 

     if (result.wasSuccessful()) { 
      LOGGER.info("All tests executed successfully: {}", result); 
     } else { 
      LOGGER.error("There are failures"); 
      for (Failure failure: result.getFailures()) { 
       LOGGER.error("failure: {} msg: {} desc: {}", failure, failure.getMessage(), failure.getDescription(), failure.getException()); 
      } 
     } 
    } 

JARを経由して、これを実行するとき、私はNullPointerExceptionが取得していますが、全く問題はとき、IDE内からmainメソッドを実行していません。
私は、テストケース用にIntelliJ 2017.2.x、JUnit 4.12、jarパッケージ用にMaven Shade Plugin 3.0を使用しています。

EDIT 1
実行ジャーよう -

java -jar myjar.jar 

NPE JAR-

2017-11-29 10:16:00,567 [TestCasesExecutor:44] ERROR junit.framework.Test - failure: testMethodName(testClass): null msg: null desc: testMethodName(testClass) 
java.lang.NullPointerException 
     at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:770) 
     at org.openqa.selenium.support.ui.FluentWait.<init>(FluentWait.java:96) 
     at org.openqa.selenium.support.ui.WebDriverWait.<init>(WebDriverWait.java:71) 
     at org.openqa.selenium.support.ui.WebDriverWait.<init>(WebDriverWait.java:45) 
     at com.mycom.SomeTestClass.setup(BaseTest.java:37) 
     at com.mycom.testcases.SplunkGcpScoreCardTest.logoutFromGcpScorecard(SplunkGcpScoreCardTest.java:27) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:498) 
     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
     at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:33) 
     at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) 
     at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) 
     at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252) 
     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 
     at org.junit.runners.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.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
     at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
     at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 
     at org.junit.runners.Suite.runChild(Suite.java:128) 
     at org.junit.runners.Suite.runChild(Suite.java:27) 
     at org.junit.runners.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.runners.ParentRunner.run(ParentRunner.java:363) 
     at org.junit.runners.Suite.runChild(Suite.java:128) 
     at org.junit.runners.Suite.runChild(Suite.java:27) 
     at org.junit.runners.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.runners.ParentRunner.run(ParentRunner.java:363) 
     at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
     at org.junit.runner.JUnitCore.run(JUnitCore.java:115) 
     at org.junit.runner.JUnitCore.run(JUnitCore.java:105) 
     at org.junit.runner.JUnitCore.runClasses(JUnitCore.java:62) 
     at org.junit.runner.JUnitCore.runClasses(JUnitCore.java:49) 
     at com.mycom.TestCasesExecutor.main(TestCasesExecutor.java:37) 

背景を介して実行する場合 - 私は生産のアプリケーションのためのいくつかのセレンのテストケースを有しています。実行のためにヘッドレスクロムのインスタンスを作成します。 これらがテストケースとしてラップされた理由は、これをsaucelabsと統合することが理想的だったからです(saucelabsは実行のためのテストケースとしてラップされたセレンコードを必要とします)。今日のようにその道を辿ることはできませんが、これを理解している間、私たちはこのコードを書いていました。だから、私はこのコードでJARを作成し、それを本番環境に配備しようとしています。このようにして、私はSaucelabsと一緒に移動することができるときに多くの変更を加える必要はありません。

+1

あなたのユニットテストは実行可能なJARに属していないと主張します。パッケージ化する前にIDEまたは統合ビルドツールで実行する必要があります。 – duffymo

+0

私のシナリオは異なります。これらはビジネスWebアプリケーション用のセレンテストケースです。私がsaucelabsと統合したいのと同じくらい、現在は選択肢ではありません。 –

+0

私とは違う音ではありません。がんばろう。スタックトレースは、何がnullであるかを示します。それはあなたにヒントを与えます。 – duffymo

答えて

0

スプリングコードとログをトラブルシューティングした後、私は私のJARはそれでspring.factoriesファイルがMETA-INFだ持っていないので、それが失敗だということを考え出しました。 可能solutions-

  1. 変更プロジェクトは、ブート春自動設定を有効にして、右のそれをパッケージ化するの世話をする春のブートMavenプラグインを使用してJARを作成します。
  2. spring.factoriesファイルを作成します。あなた自身のプロジェクト(refer spring doc)を書くか、spring.factoriesをプロジェクトの任意の春の依存関係からコピーできます。 Related question on SO

このシナリオでは簡単だったので、オプション2を使用しました。私はスプリング・ブーツの依存関係から春だけではなく、何も必要としなかったので、オプション1は過度のものでした。

関連する問題