2009-09-30 16 views
6

Qual è il modo migliore per eseguire il test delle unità con Spring? Presumo che la combinazione TestNG & jmockit con Spring 3 non sia male, quindi è quello che sto facendo in questo momento, ma se sto selezionando gli strumenti per il mio nuovo progetto Spring, per favore dimmelo subito. :-)TestNG e Spring 3

In ogni caso, ho creato un'entità che voglio testare, ma non sono sicuro di come eseguire effettivamente TestNG dal contesto Spring. Ho creato una semplice classe di test

package com.mydomain.data.entities.test; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.ApplicationContext; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; 
import org.testng.Assert; 
import org.testng.annotations.*; 

@ContextConfiguration(locations={"classpath:applicationContext.xml"}) 
public class SimpleTest extends AbstractTestNGSpringContextTests { 

    @Autowired 
    private ApplicationContext applicationContext; 

    @BeforeClass 
    protected void setUp() throws Exception { 
     Assert.assertNotNull(applicationContext); 
    } 

    @Test 
    public void testNothing() { 

    } 

} 

con applicationContext.xml importazione di fagioli per impostare il livello di modello e di business. Prima di tutto, mi piacerebbe che usasse applicationContext.xml da Project/WebRoot/WEB-INF, mentre la fonte di questo test risiede in Project/src/com/mydomain/data/entities/test, ma credo che /applicationContext.xml mi darebbe Progetti/src, come classpath: è corretto?

Inoltre, ora che sto usando il modello e i livelli aziendali che la mia applicazione web userebbe, dovrei aspettarmi che si comporti in modo simile. Ma, quando lancio TestNG sul test, Sais: org.hibernate.cfg.ExtendedMappings classe ha org.hibernate.cfg.Mappings interfaccia come super-classe:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in URL [file:/Users/niklas/Documents/Eclipse/Project/WebRoot/WEB-INF/Project-Model.xml]: Invocation of init method failed; nested exception is java.lang.IncompatibleClassChangeError: class org.hibernate.cfg.ExtendedMappings has interface org.hibernate.cfg.Mappings as super class 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1393) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:449) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:289) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:286) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:352) 
    at org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:266) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators(PersistenceExceptionTranslationInterceptor.java:121) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.<init>(PersistenceExceptionTranslationInterceptor.java:77) 
    at org.springframework.dao.annotation.PersistenceExceptionTranslationAdvisor.<init>(PersistenceExceptionTranslationAdvisor.java:70) 
    at org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor.setBeanFactory(PersistenceExceptionTranslationPostProcessor.java:99) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1414) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1381) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511) 
    ... 38 more 
Caused by: java.lang.IncompatibleClassChangeError: class org.hibernate.cfg.ExtendedMappings has interface org.hibernate.cfg.Mappings as super class 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:700) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) 
    at java.net.URLClassLoader.access$000(URLClassLoader.java:56) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:195) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:319) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:330) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:254) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:399) 
    at org.hibernate.cfg.AnnotationConfiguration.createExtendedMappings(AnnotationConfiguration.java:187) 
    at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:277) 
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1162) 
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:667) 
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1452) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1390) 
    ... 53 more 

Che cosa è questo e perché mi appare Questo? Qualche indizio?

mio sessionFactory assomiglia a questo

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="annotatedClasses"> 
     <list> 
     <!-- Entity classes from package com.mydomain.data.entities --> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
     <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
     <prop key="hibernate.show_sql">false</prop> 
     </props> 
    </property> 
    </bean> 
+0

Il supporto di test di SPring è per test di integrazione, non test di unità. È possibile utilizzare JUnit normale o TestNG per il test dell'unità. Quindi quali test stai effettivamente cercando di raggiungere? – SteveD

risposta

5

Ora il problema non sembra essere correlato a nessuno di Spring o TestNG. La parte chiave è:

java.lang.IncompatibleClassChangeError: class org.hibernate.cfg.ExtendedMappings has interface org.hibernate.cfg.Mappings as super class 

Sei sicuro che CLASSPATH è OK? Cioè hai una versione compatibile dei moduli di Hibernate e non ci sono ripetizioni?

Che cosa succede se si crea un semplice test TestNG che esegue le seguenti operazioni:

Class.forName("org.hibernate.cfg.ExtendedMappings"); 

?

+0

Quindi, se do il test un contesto vuoto Posso eseguire un test che include Class.forName, che mi dà: java.lang.IncompatibleClassChangeError: class org.hibernate.cfg.ExtendedMappings ha un'interfaccia org.hibernate.cfg.Mappings come super-classe Ma quando eseguo lo stesso nel mio contesto servlet, non ho un problema. E hanno lo stesso percorso di classe. – niklassaers

+0

Credo che l'unico posto in cui ExtendedMappings sia definito in uno qualsiasi dei miei file jar sia in hibernate-annotations.jar. – niklassaers

+0

Hmm, questo potrebbe essere perché sto eseguendo Hibernate 3.5-beta1 con Hibernate-Annotations 3.4. Lasciatemi provare a eseguire il downgrade a 3.4 e vedere se sono più allineati :-) – niklassaers

1

Consultare il capitolo sulla TestNG nella documentazione primavera:

+0

Non ti preoccupare, ho solo scritto qui dopo aver letto "Spring TestContext Framework" nel manuale di riferimento Spring 3 due volte e ho letto un bel po 'di tutorial – niklassaers

7

tuo ckass prova ha la necessità di estendere la AbstractTestNGSpringContextTests. O se il tuo codice sta testando l'accesso al database, un'altra classe utile da estendere è AbstractTransactionalTestNGSpringContextTests.

+0

Grazie mille. Estendere AbstractTestNGSpringContextTests ha fatto caricare il contesto, ma mi dà una strana eccezione durante l'inizializzazione. Ho aggiornato la mia domanda con le eccezioni che fornisce al mio contesto – niklassaers

+0

Si prega di votare questo come è la risposta alla domanda originale ed è quello che stavo cercando (ad esempio: Utilizzo di Spring con TestNG) –

0

Si potrebbe voler provare hibernate-annotations-3.5.0-Beta-1 come questo si allinea con hibernate-core-3.5.0-Beta-1.

A volte, ottengo ancora java.lang.IncompatibleClassChangeError, mentre sto cercando di utilizzare la ricerca di ibernazione che utilizza le "vecchie" annotazioni.

Inoltre, non sono sicuro se si sta eseguendo JBoss, ma se si è che si otterrà questo errore con core 3.5.0.

+0

Se stai usando hibernate-core-3.5.x, dovrebbe includere le annotazioni (e entityManager) - i vasi separati non sono più necessari secondo ibernazione https://www.hibernate.org/397.html – John

+0

Questo è quello che pensavo, ma ho ancora bisogno di inserire annotazioni. Se si guardano le annotazioni di ibernazione pom, ha una funzione di hibernate-core come dipendenza. Quello che penso che ibernare significhi è che i numeri di versione sono allineati. O ho bevuto troppa birra :) –

1

Per me questo problema è stato causato dal fatto che avevo diverse versioni di ibernazione incluse me stesso, non a causa di una terza parte che li includeva.Un colpo del tuo progetto/poms per assicurarti che tu stia usando solo una versione ibernata vale la pena.