SpringJUnit4ClassRunner - Failed to load ApplicationContext

ThirdKeeper

Mitglied
Hallöchen!

Habe folgendes Problem mit JUnit Tests.
Die u.a. Testklasse wirft den darunter abgebildeten Stacktrace (verkürzt).

Das Seltsame ist, dass die Fehlermeldung z.B. auf meinem Laptop geworfen wird und auf meinem Desktop PC nicht? Bei meinem Kollegen genau umgekehrt.

Kopiere ich das Projekt auf dem Desktop PC von Ordner A (das Projekt ist hier fehlerfrei) in Ordner B, importiere es und führe es dann aus, tritt das Problem ebenfalls auf?

Testklasse
Code:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/META-INF/applicationContext-test.xml")
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
public class MemberServiceTest extends AbstractJpaTests {

    @Autowired
    private MemberService memberService;
    private Member member;

    @Transactional
    @Rollback(false)
    @Test
    public void createMember() {
        member = new Member("Harry", "Mustermann", "Antonius", "Antonius@mustermann.de", new Date());
        memberService.create(member);
        assertNotNull(member.getId());
    }

    @Transactional
    @Rollback(false)
    @Test
    public void readMember() {
        member = memberService.findByEmail("Antonius@mustermann.de");
        assertNotNull(memberService.getById(member.getId()));
        assertNotNull(memberService.findByEmail(member.getEmail()));
        assertNotNull(memberService.findByName(member.getName()));
    }

    @Transactional
    @Rollback(false)
    @Test
    public void updateMember() {
        member = memberService.findByEmail("Antonius@mustermann.de");
        member.setNick("AliG");
        member = memberService.update(member);
        assertEquals(member.getNick(), "AliG");
        assertNotNull(memberService.getById(member.getId()));
        assertEquals(memberService.findByName("Mustermann").get(0).getNick(), "AliG");
    }

    @Transactional
    @Rollback(false)
    @Test
    public void deleteMember() {
        memberService.delete(memberService.findByEmail("Antonius@mustermann.de"));
    }
}

Stacktrace:
Code:
createMember(de.test.dao.MemberServiceTest)  Time elapsed: 0 sec  <<< ERROR!
java.lang.IllegalStateException: Failed to load ApplicationContext
        at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:201)
        at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
        at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
        at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:255)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:111)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:148)
        at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
        at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
        at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
        at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
        at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)
        at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62)
        at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140)
        at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127)
        at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:338)
        at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:997)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'persistentContextFactory' defined in class path resource [META-INF/applicationContext-test.xml]: Cannot resolve reference to bean 'entityManagerFactory' while setting bean property 'entityManagerFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [META-INF/applicationContext-test.xml]: Invocation of init method failed; nested exception is java.lang.AssertionError
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1245)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
        at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:84)
        at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:42)
        at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:173)
        at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:197)
        ... 21 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [META-INF/applicationContext-test.xml]: Invocation of init method failed; nested exception is java.lang.AssertionError
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269)
        ... 40 more
Caused by: java.lang.AssertionError
        at oracle.toplink.essentials.ejb.cmp3.persistence.PersistenceUnitProcessor.computePURootURL(PersistenceUnitProcessor.java:248)
        at oracle.toplink.essentials.ejb.cmp3.persistence.PersistenceUnitProcessor.findPersistenceArchives(PersistenceUnitProcessor.java:232)
        at oracle.toplink.essentials.ejb.cmp3.persistence.PersistenceUnitProcessor.findPersistenceArchives(PersistenceUnitProcessor.java:216)
        at oracle.toplink.essentials.internal.ejb.cmp3.JavaSECMPInitializer.initialize(JavaSECMPInitializer.java:239)
        at oracle.toplink.essentials.internal.ejb.cmp3.JavaSECMPInitializer.initializeFromMain(JavaSECMPInitializer.java:278)
        at oracle.toplink.essentials.internal.ejb.cmp3.JavaSECMPInitializer.getJavaSECMPInitializer(JavaSECMPInitializer.java:81)
        at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.createEntityManagerFactory(EntityManagerFactoryProvider.java:119)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:83)
        at org.springframework.orm.jpa.LocalEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalEntityManagerFactoryBean.java:91)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:291)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1369)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335)
        ... 50 more
 
...hast du in unterschiedlichen Fällen Assertions enabled (JVM Option -ea für enable , -da für disable)?...

Es wurden keine JVM Optionen gesetzt. Werder bei mir, noch bei meinem Kollegen.
Alles DEFAULT.

...
Kopiere ich das Projekt auf dem Desktop PC von Ordner A (das Projekt ist hier fehlerfrei) in Ordner B, importiere es und führe es dann aus, tritt das Problem ebenfalls auf?...
Verändere durch das Kopieren des Porjektes ja auch nicht die JVM Parameter.
 
Zuletzt bearbeitet:
Hallo,

Verändere durch das Kopieren des Porjektes ja auch nicht JVM Parameter.
schon klar...

Hatte nur mal ne ähnliche Situation: JUnit test ging nicht obwohl der Teil in der Anwendung prima durchlief... -> Bei JUnit war von Maven -ea gesetzt und beim normalen lauf war -da gesetzt...

Ansonsten knallts bei dir hier:
http://fisheye5.atlassian.com/brows...mp3/persistence/PersistenceUnitProcessor.java

computeBootURL:

Entweder bei:
assert(conn.getJarEntry().getName().equals(
"META-INF/persistence.xml")); // NOI18N
oder:
assert(new File(pxmlURL.getFile()).isFile());

Sind da vielleicht irgendwo noch absolute bzw. ungünstige relative Pfade drinnen?

Gruß Tom
 
Hatte nur mal ne ähnliche Situation: JUnit test ging nicht obwohl der Teil in der Anwendung prima durchlief... -> Bei JUnit war von Maven -ea gesetzt und beim normalen lauf war -da gesetzt...

Interessante Sache, da wir ebenfalls Maven nutzen und in der Anwendung auch alles funktioniert. :)

Edit:
Ups, übersehen! Da stand ja noch mehr. ^^
Die Angaben muss ich noch eben prüfen.
 
Zuletzt bearbeitet:
Verwendet wird übrigens:
Spring 2.5.6, JUnit 4.4, Maven, Toplink 2.0.36 und Tomcat 6.0.20.
Sind da vielleicht irgendwo noch absolute bzw. ungünstige relative Pfade drinnen?
Absolute Pfade sind nicht vorhanden. Die relativen Pfade sollten zumindest (lt. meiner Überprüfung) nicht ungünstig liegen.
Nur die Pfadstruktur empfinde ich ein wenig verwirrend. :)

Die "applicationContext-test.xml" wird geladen. Es ist davon aus zu gehen, da keine IOException geworfen wird.
Geworfen wird eine FileNotFoundException, wenn im @ContextConfiguration einen nicht vorhandenen XML-File eintragen wird.

...assert(conn.getJarEntry().getName().equals(
"META-INF/persistence.xml")); // NOI18N
oder:
assert(new File(pxmlURL.getFile()).isFile());...

Es ist zu vermuten, dass die "persistence.xml" nicht gefunden wird
oder dass der Fehler in der "applicationContext-test.xml" liegt.

applicationContext-test.xml
Code:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

    <bean id="persistentContextFactory"
          class="org.apache.myfaces.orchestra.conversation.spring.JpaPersistenceContextFactory">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
        p:entityManagerFactory-ref="entityManagerFactory"/>

    <bean id="entityManagerFactory"
          class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="easyscrumdb"/>
    </bean>

    <bean class="de.project.dao.MemberServiceImpl" id="memberService"/>

</beans>

Pfadstruktur:
projektordner...

src\main\java\de\
projektunterordner...

src\main\resources\META-INF\
applicationContext-test.xml
persistence.xml
orchestra.taglib.xml
spring-orchestra-init.xml

src\main\webapp\META-INF\
context.xml

src\main\webapp\WEB-INF\
applicationContext.xml
faces-config.xml
web.xml

src\test\
java.de.dao.test.TestMemberService.java

Falls noch Code zur Problemlösung benötigt wird, lasst es mich unbedingt wissen!
 
Zuletzt bearbeitet:
Nachdem ich nun den kompletten NetBeans Projektordner aus dem Standard Home Verzeichnis genommen habe und diesen auf eine andere Festplatte geschoben habe, funktioniert nun alles?

Und ich habe 100%ig nichts am Quellcode verändert!

Das soll mal jemand verstehen! :eek:

Kann mir das jemand erklären?
 
Zuletzt bearbeitet:
Hallo zusammen!

Auch, wenn's ein bisschen spät sein kann:

Die maximale Länge eines Kommandozeilenaufruf's unter Windows ist 32767 Zeichen.
Solte der abgesetzte Befehl länger sein, wird der Rest einfach abgeschnitten.

Beim Kompilieren mit Maven werden u.U. sehr lange "Kommandos" generiert (die länger als die 32767 Zeichen sind), da Maven jedes einzelne .jar, welches einbezogen werden soll per Parameter mit vollem Pfad übergibt.

Hier würde ich vermuten, dass einfach einige .jars für den Classpath geschluckt worden sind.

Wenn du dein Projekt jetzt auf eine andere Platte/anderen Rechner verschiebst, kann es sein, dass sich der Pfad zu irgendwelchen .jar's verkürzt und somit die generierte Kommandozeile kürzer wird.
Dann klappt wieder alles.

Hoffe das war halbwegs verständlich.
 
Zurück