web-dev-qa-db-ja.com

NoClassDefFoundError ErrorCoded

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
Eric Hansen

ビルドの何かが、春のテスト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 {
0
kj007

私にとってはたまたま以前のバージョンのspring-testspring-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>
0
prayagupd

私はこれに正確に答えることはできませんが、なぜそれがエラーなのですか?いくつかの依存関係のバージョンに競合があると私は言うことができます。

以下のドキュメントでわかるように(ただし、バージョン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を使用しているかを確認する必要があります。

お役に立てれば。

0
trjade