SpringBootアプリでJUnitテストを実行しようとしていますが、以下に示すNoClassDefFoundErrorを取得しています。
Spring-boot-starter-parentとspring-boot-starter-test(v2.0.5.RELEASE)の両方がpom.xmlファイルにあります。スプリングコア(v5.0.9.RELEASE)も追加しました。
確かに、ErrorCodedクラスは4.3.6の時点で非推奨になっているため、テストランナー(または他のライブラリ)がまだこのクラスをロードしようとしている理由を確認する方法がわかりません。
これが私のテストクラスです:
@RunWith(SpringJUnit4ClassRunner.class)
public class SystemBuilderTest {
private System system;
@Before
public void setUp() throws Exception {
StatefulConnection conn = new StatefulConnection.Builder(null)
.build();
Device d1 = new SensingDevice.Builder("sensor1", conn)
.build();
system = new System.SystemBuilder("testSystem")
.addChildDevice(d1)
.build();
system.initialize();
}
@Test
public void testStart() throws DCFDeviceException {
system.start();
assertTrue(system.getName().equals("testSystem"));
assertTrue(system.getChildDevices().size() == 1);
assertTrue(system.getChildDevices().iterator().next().getName().equals("sensor1"));
}
}
...そしてスタックトレース:
Java.lang.NoClassDefFoundError: org/springframework/core/ErrorCoded
at Java.base/Java.lang.ClassLoader.defineClass1(Native Method)
at Java.base/Java.lang.ClassLoader.defineClass(ClassLoader.Java:1007)
at Java.base/Java.security.SecureClassLoader.defineClass(SecureClassLoader.Java:174)
at Java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.Java:801)
at Java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.Java:699)
at Java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.Java:622)
at Java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.Java:580)
at Java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.Java:185)
at Java.base/Java.lang.ClassLoader.loadClass(ClassLoader.Java:496)
at Java.base/Java.lang.ClassLoader.defineClass1(Native Method)
at Java.base/Java.lang.ClassLoader.defineClass(ClassLoader.Java:1007)
at Java.base/Java.security.SecureClassLoader.defineClass(SecureClassLoader.Java:174)
at Java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.Java:801)
at Java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.Java:699)
at Java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.Java:622)
at Java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.Java:580)
at Java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.Java:185)
at Java.base/Java.lang.ClassLoader.loadClass(ClassLoader.Java:496)
at org.springframework.context.support.GenericApplicationContext.<init>(GenericApplicationContext.Java:110)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.Java:115)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.Java:60)
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.Java:275)
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.Java:251)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.Java:99)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.Java:117)
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.Java:108)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.Java:117)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.Java:83)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.Java:246)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.Java:227)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.Java:289)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.Java:12)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.Java:291)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.Java:246)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.Java:97)
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:190)
at org.Eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.Java:86)
at org.Eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.Java:38)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:538)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:760)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.Java:460)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.Java:206)
Caused by: Java.lang.ClassNotFoundException: org.springframework.core.ErrorCoded
at Java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.Java:582)
at Java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.Java:185)
at Java.base/Java.lang.ClassLoader.loadClass(ClassLoader.Java:496)
... 50 common frames omitted
提案を事前にありがとう...
ビルドの何かが、春のテスト4.3.xへの依存関係を引き込んでいます(どのマイナーリリースかはわかりませんが、関係ありません)。
これは、スタックトレースの行番号が5.xリリースのSpringJUnit4ClassRunnerクラスの行番号と一致しないためです。
あなたのスタックトレースから:
_at o.s.t.c.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.Java:227)
_
これは、227行目でcreateTest
メソッドを呼び出す必要があることを示しています。これは、このクラスの 4.3.xブランチバージョン で正しいことがわかります。
しかし 5.0.xブランチバージョン では、227行目はgetTestContextManager().prepareTestInstance(testInstance);
の呼び出しです。
これはかなり決定的です。したがって、IDEが(別のコメントで示したように)別の方法で通知している場合)は誤りです。または、IDEはその機能をサポートしています。
完全なpomを投稿しなかったので、古い依存関係を何が引き込んでいるかを伝えることはできません。ただし、Maven依存関係プラグインを使用してそれを理解できるはずです。
_mvn dependency:tree
_
このコマンドは、依存関係の階層をツリー形式で出力します。春のテストのために、出力をファイルにリダイレクトしてgreppingすることをお勧めします。これにより、問題のある依存関係を特定し、Maven _<exclusion>
_を使用して問題のある依存関係を禁止できます。
SpringRunner.class
を使用してテストを解除できますか。@SpringBootTest
は必要なすべてのテスト依存関係をロードします。
@RunWith(SpringRunner.class)
@SpringBootTest
public class SystemBuilderTest {
私にとってはたまたま以前のバージョンのspring-testがspring-security-test
に引っ張られました。 spring-boot 2.xを使用しています。
λ mvn dependency:tree | grep test
[INFO] +- org.springframework.security:spring-security-test:jar:4.2.3.RELEASE:test
[INFO] | \- org.springframework:spring-test:jar:4.3.9.RELEASE:test
Spring-securityとspring-security-testを5.x
に更新して修正しました。
<properties>
<Java.version>1.8</Java.version>
<spring.version>2.0.4.RELEASE</spring.version>
<logging.version>2.8.2</logging.version>
<spring-security-test.version>5.0.6.RELEASE</spring-security-test.version>
<spring-security-config.version>5.0.6.RELEASE</spring-security-config.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring-security-config.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring-security-config.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<version>${spring-security-test.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
私はこれに正確に答えることはできませんが、なぜそれがエラーなのですか?いくつかの依存関係のバージョンに競合があると私は言うことができます。
以下のドキュメントでわかるように(ただし、バージョン2.0.5.RELEASEを使用しています)。
https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/
ErrorCodedはSpringJUnit4ClassRunnerで使用されますが、Githubに表示される場合、org.springframework.spring-testのバージョン5.0.8ではSpringJUnit4ClassRunnerはErrorCodedを使用しなくなりました。
SpringJUnit4ClassRunnerはそのjarにあるため、Springプロジェクトが実際にどのバージョンのorg.springframework.spring-testを使用しているかを確認する必要があります。
お役に立てれば。