it-swarm.com.de

NoClassDefFoundError ErrorCoded

Ich versuche, einen JUnit-Test in meiner SpringBoot-App auszuführen, erhalte jedoch den unten gezeigten NoClassDefFoundError.

Sowohl der Spring-Boot-Starter-Parent als auch der Spring-Boot-Starter-Test (v2.0.5.RELEASE) befinden sich in der Datei pom.xml. Ich habe auch den Federkern (v5.0.9.RELEASE) hinzugefügt. 

Anscheinend wurde die ErrorCoded-Klasse seit 4.3.6 nicht mehr unterstützt. Daher bin ich nicht sicher, wie ich herausfinden kann, warum der Testläufer (oder eine andere Bibliothek) immer noch versucht, diese Klasse zu laden.

Hier ist meine Testklasse:

@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"));

    }
} 

... und der Stack-Trace:

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

Vielen Dank im Voraus für alle Vorschläge ...

3
Eric Hansen

Etwas in Ihrem Build zieht eine Abhängigkeit von Spring-Test 4.3.x ein (nicht sicher, welche Nebenversion, aber es sollte nicht relevant sein.)

Ich sage dies deshalb, weil die Zeilennummern in der Stapelablaufverfolgung nicht mit den Zeilennummern in der SpringJUnit4ClassRunner-Klasse in den 5.x-Versionen übereinstimmen.

Von Ihrem Stack-Trace:

at o.s.t.c.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.Java:227)

Dies bedeutet, dass in Zeile 227 eine createTest-Methode aufgerufen werden sollte. Sie sehen, dass dies in der Zweigversion 4.3.x dieser Klasse zutrifft.

In der Zweigversion 5.0.x ist Zeile 227 jedoch ein Aufruf von getTestContextManager().prepareTestInstance(testInstance);.

Das ist ziemlich schlüssig. Wenn Ihr IDE Ihnen sonst etwas sagt (wie Sie in einem anderen Kommentar angegeben haben), ist dies falsch. Oder Sie müssen möglicherweise Ihr Projekt "bereinigen", wenn IDE diese Funktionalität unterstützt.

Da Sie Ihren Pom nicht vollständig gepostet haben, ist es nicht möglich, Ihnen zu sagen, was die alte Abhängigkeit beeinflusst. Sie sollten jedoch in der Lage sein, dies mithilfe des Maven-Abhängigkeits-Plugins herauszufinden:

mvn dependency:tree

Dieser Befehl druckt die Abhängigkeitshierarchie in Baumform. Ich empfehle, die Ausgabe in eine Datei umzuleiten und für den Frühlingstest zu suchen. Auf diese Weise können Sie die problematische Abhängigkeit identifizieren und einen Maven <exclusion> verwenden, um die problematische Abhängigkeit auszuschließen.

Können Sie sich Ihren Test mit SpringRunner.class gefallen lassen, und @SpringBootTest lädt alle erforderlichen Testabhängigkeiten.

@RunWith(SpringRunner.class)
@SpringBootTest
public class SystemBuilderTest {
0
kj007

Ich kann das nicht genau beantworten, warum es ein Fehler ist, aber ich kann sagen, dass Sie den Konflikt in der Version einer Abhängigkeit haben.

Wie Sie im folgenden Dokument sehen können (obwohl Sie Version 2.0.5.RELEASE verwenden).

https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/

ErrorCoded wird von SpringJUnit4ClassRunner verwendet, aber wenn Sie in ihrem Github sehen, verwendet SpringJUnit4ClassRunner in Version 5.0.8 von org.springframework.spring-test nicht mehr ErrorCoded.

Sie müssen sehen, ob Ihr Spring-Projekt wirklich verwendet, welche Version von org.springframework.spring-test verwendet wird, da SpringJUnit4ClassRunner in diesem Behälter ist.

Hoffe das hilft.

0
trjade