web-dev-qa-db-fra.com

NoClassDefFoundError ErrorCoded

J'essaie d'exécuter un test JUnit dans mon application SpringBoot, mais le message NoClassDefFoundError présenté ci-dessous s'affiche.

Le parent printemps-boot-starter-parent et le printemps-boot-starter-test (v2.0.5.RELEASE) sont tous deux dans le fichier pom.xml. J'ai ajouté le ressort-core (v5.0.9.RELEASE) dans. 

Apparemment, la classe ErrorCoded est obsolète depuis la version 4.3.6, donc je ne sais pas comment savoir pourquoi le lanceur de tests (ou une autre bibliothèque) tente toujours de charger cette classe.

Voici ma classe de test:

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

    }
} 

... et la trace de la pile:

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

Merci d'avance pour toute suggestion...

3
Eric Hansen

Quelque chose dans votre construction tire dans une dépendance sur Spring-test 4.3.x (vous ne savez pas quelle version mineure, mais cela ne devrait pas être pertinent.)

La raison pour laquelle je dis cela est que les numéros de ligne de la trace de pile ne sont pas alignés sur les numéros de ligne de la classe SpringJUnit4ClassRunner des versions 5.x.

A partir de votre trace de pile:

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

Cela indique qu’à la ligne 227, il devrait y avoir un appel à une méthode createTest. Vous pouvez voir que cela est vrai dans la version de branche 4.3.x de cette classe.

Mais dans la version de branche 5.0.x , la ligne 227 est plutôt un appel à getTestContextManager().prepareTestInstance(testInstance);.

C'est assez concluant. Donc, si votre IDE vous dit le contraire (comme vous l'avez indiqué dans un autre commentaire), c'est faux. Vous pouvez également avoir besoin de "nettoyer" votre projet si le IDE prend en charge cette fonctionnalité.

Comme vous n'avez pas posté votre pom complet, il n'est pas possible de vous dire ce qui rentre dans l'ancienne dépendance. Cependant, vous devriez être capable de le comprendre en utilisant le plugin de dépendance Maven:

mvn dependency:tree

Cette commande imprimera la hiérarchie des dépendances sous forme d'arborescence. Je recommande de rediriger la sortie vers un fichier et de créer un grepping pour le test de printemps. Cela vous permettra d’identifier la dépendance problématique et d’utiliser un maven <exclusion> pour interdire la dépendance problématique.

0

Pouvez-vous plaire votre test avec SpringRunner.class et @SpringBootTest chargera toutes les dépendances de test requises.

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

Je ne peux pas répondre exactement à cette question. Pourquoi est-ce une erreur, mais je peux dire que vous avez le conflit dans la version de certaines dépendances.

Comme vous pouvez le voir dans le document ci-dessous (bien que vous utilisiez la version 2.0.5.RELEASE).

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

ErrorCoded est utilisé par SpringJUnit4ClassRunner mais si vous voyez dans leur Github, SpringJUnit4ClassRunner n'utilise plus ErrorCoded dans la version 5.0.8 de org.springframework.spring-test.

Vous devez voir si votre projet Spring utilise vraiment quelle version de org.springframework.spring-test car SpringJUnit4ClassRunner se trouve dans ce fichier.

J'espère que cela t'aides.

0
trjade