Pregunta

¿Cuál es la mejor manera de hacer pruebas unitarias con primavera? Supongo que la combinación Testng & JMockit con Spring 3 no está mal, así que eso es lo que estoy haciendo en este momento, pero si estoy fuera de curso seleccionando las herramientas para mi nuevo proyecto de primavera, por favor dígame de inmediato. :-)

De todos modos, he creado una entidad que quiero probar, pero no estoy seguro de cómo ejecutar realmente la prueba desde el contexto de primavera. He creado una clase de prueba 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() {

    }

}

con ApplicationContext.xml importando frijoles para configurar el modelo y la capa de negocios. En primer lugar, me gustaría que use ApplicationContext.xml de Project/Webroot/Web-INF, mientras que la fuente de esta prueba vive en Project/Src/Com/Mydomain/Data/Entities/Test, pero creo que creo que /applicationContext.xml me daría proyectos/src, igual que classpath: ¿es esto correcto?

Además, ahora que estoy usando el modelo y las capas comerciales que usaría mi aplicación web, debería esperar que se comporte de manera similar. Pero, cuando lanceo la prueba en la prueba, es sais: clase org.hibernate.cfg.extendedMappings tiene interfaz org.hibernate.cfg.mappings como súper clase:

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

¿Qué es esto y por qué estoy obteniendo esto? ¿Alguna pista?

Mi factory de session se ve así

  <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>
¿Fue útil?

Solución

Ahora el problema no parece estar relacionado con ninguno de Spring o Testng. La parte clave es:

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

¿Estás seguro de que tu classpath está bien? Es decir, ¿tienes una versión compatible de módulos hibernados y no hay repeticiones allí?

¿Qué pasa si crea una prueba de prueba simple que hace lo siguiente?

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

?

Otros consejos

Su prueba CKASS debe extenderse AbstractTngSpringContextTests. O si su código está probando la base de datos que acciona otra clase útil para extender es AbstractTransactionAltestngSpringContextTests.

Consulte el capítulo sobre Testng en la documentación de primavera:

Para mí, este problema fue causado porque tenía diferentes versiones hibernadas incluidas, no por un tercero que incluye ellas. Vale la pena un barrido de su proyecto/POMS para asegurarse de que vale la pena usar una versión hibernada.

Es posible que desee probar Hibernate-Annotations-3.5.0-Beta-1, ya que esto se alinea con Hibernate-Core-3.5.0-Beta-1.

Todavía obtengo el java.lang.incompatibleClassChangeError a veces, ya que estoy tratando de usar Hibernate Search que está utilizando las anotaciones "viejas".

Además, no estoy seguro si está ejecutando JBoss, pero si lo está, obtendrá este error con Core 3.5.0.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top