문제

Spring으로 단위 테스트를 수행하는 모범 사례 방법은 무엇입니까? 나는 Spring 3의 Testng & Jmockit 조합이 나쁘지 않다고 가정하므로 지금 내가하고있는 일이지만, 신선한 스프링 프로젝트를위한 도구를 선택하는 과정을 벗어나면 즉시 알려주십시오. :-)

어쨌든, 나는 테스트하고 싶은 엔티티를 만들었지 만 실제로 스프링 컨텍스트에서 테스트를 실행하는 방법을 잘 모르겠습니다. 간단한 테스트 클래스를 만들었습니다

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

    }

}

ApplicationContext.xml을 사용하여 모델 및 비즈니스 계층을 설정하기위한 Bean을 가져옵니다. 먼저, 프로젝트/webroot/web-inf의 ApplicationContext.xml을 사용하고 싶지만이 테스트의 소스는 Project/SRC/Com/MyDomain/Data/Entities/Test에 남아 있지만 믿습니다. /applicationcontext.xml은 classpath와 마찬가지로 프로젝트/src를 제공합니다. 이것이 맞습니까?

또한 이제 웹 애플리케이션이 사용할 모델 및 비즈니스 계층을 사용하므로 비슷하게 행동 할 것으로 예상됩니다. 그러나 테스트에서 testng를 시작하면 sais : class org.hibernate.cfg.extendedmappings는 인터페이스 org.hibernate.cfg.mappings as 슈퍼 클래스 :

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

이것이 무엇이며 왜 이것을 얻는가? 단서가 있습니까?

내 세션은 다음과 같습니다

  <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>
도움이 되었습니까?

해결책

이제 문제는 스프링이나 테스트와 관련이없는 것 같습니다. 핵심 부분은 다음과 같습니다.

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

당신의 클래스 경로가 괜찮다고 확신합니까? 즉, 당신은 호환 가능한 최대 절전 모듈의 버전을 가지고 있으며 거기에 반복이 없습니까?

다음을 수행하는 간단한 TestNG 테스트를 만드는 경우 어떻게해야합니까?

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

?

다른 팁

테스트 CKASS는 확장해야합니다 AbstractTestNgspringContextTests. 또는 코드가 데이터베이스를 테스트하는 경우 확장 할 또 다른 유용한 클래스가 AbstractTransactionAltestngspringContextTests.

스프링 문서에서 TestNG의 장을 참조하십시오.

나 에게이 문제는 내가 포함 된 제 3자가 아니라 나 자신이 포함 된 다른 최대 절전 모드 버전을 가지고 있었기 때문에 발생했다. YouSerlf가 하나의 최대 절전 모드 버전 만 사용하는 것이 가치가 있는지 확인하기 위해 프로젝트/POMS를 청소합니다.

이는 최대 절전 모드 코어 -3.5.0-Beta-1과 일치하기 때문에 최대 절전 모니트-3.5.0- 베타 -1을 시도 할 수 있습니다.

나는 "오래된"주석을 사용하는 최대 절전 모드 검색을 사용하려고하기 때문에 여전히 java.lang.incompatibleclasschangeerror를 얻습니다.

또한 JBoss를 실행 중인지 확실하지 않지만 Core 3.5.0 으로이 오류가 발생합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top