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と一緒に移動することができるときに多くの変更を加える必要はありません。
あなたのユニットテストは実行可能なJARに属していないと主張します。パッケージ化する前にIDEまたは統合ビルドツールで実行する必要があります。 – duffymo
私のシナリオは異なります。これらはビジネスWebアプリケーション用のセレンテストケースです。私がsaucelabsと統合したいのと同じくらい、現在は選択肢ではありません。 –
私とは違う音ではありません。がんばろう。スタックトレースは、何がnullであるかを示します。それはあなたにヒントを与えます。 – duffymo