Question

Quelle est la meilleure façon de faire la pratique des tests unitaires avec le printemps? Je suppose que la combinaison TestNG & jmockit avec Spring 3 est pas mal, de sorte que ce que je fais en ce moment, mais si je sélectionne les outils hors cours pour mon nouveau projet de printemps, s'il vous plaît me dire tout de suite. : -)

Quoi qu'il en soit, j'ai créé une entité que je veux tester, mais je ne suis pas sûr de savoir comment exécuter réellement le TestNG du contexte de printemps. J'ai créé une classe de test simple

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() {

    }

}

avec applicationContext.xml importer des haricots pour la mise en place de la couche de modèle et d'affaires. Tout d'abord, je voudrais qu'il utiliser le applicationContext.xml du projet / WebRoot / WEB-INF, alors que la source de ce test vit dans Projet / src / com / mydomain / data / entités / test, mais je crois que /applicationContext.xml me donner des projets / src, même que classpath: Est-ce correct

En outre, maintenant que je suis en utilisant les couches de modèle et d'affaires que mon application Web utiliserait, j'attendre à un comportement similaire. Mais, quand je lance TestNG sur le test, il SAIS: org.hibernate.cfg.ExtendedMappings de classe a org.hibernate.cfg.Mappings d'interface en tant que 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

Quel est ce et pourquoi suis-je obtenir ce? Des indices?

Mon sessionFactory ressemble à ceci

  <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>
Était-ce utile?

La solution

Maintenant, le problème ne semble pas être lié à aucun printemps ou TestNG. La partie clé est:

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

Êtes-vous sûr que votre CLASSPATH est OK? C'est à dire. vous avez la version compatible de modules Hibernate et pas de répétitions là-bas?

Que faire si vous créez un simple test TestNG qui effectue les opérations suivantes:

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

Autres conseils

Votre ckass de test doit s'étendre AbstractTestNGSpringContextTests . Ou si votre code est la base de données test acces autre classe utile d'étendre est AbstractTransactionalTestNGSpringContextTests .

Consulter le chapitre sur TestNG dans la documentation du printemps:

Pour moi, ce problème a été causé parce que j'avais différentes versions de mise en veille prolongée moi-même inclus, non pas à cause d'un tiers, y compris les. Un balayage de votre projet / poms pour vous assurer youserlf n'utilisez une version mise en veille prolongée est utile.

Vous pouvez essayer hibernate-annotations-3.5.0-bêta-1 comme ce soit aligné avec mise en veille prolongée-core-3.5.0-bêta-1.

Je reçois toujours le java.lang.IncompatibleClassChangeError parfois, comme je suis en train d'utiliser la recherche de mise en veille prolongée qui utilise les annotations « anciens ».

En outre, ne sais pas si vous utilisez JBoss, mais si vous êtes vous obtiendrez cette erreur avec le noyau 3.5.0.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top