Вопрос

Как лучше всего провести модульное тестирование с весной? Я предполагаю, что комбинация Testng & Jmockit с Spring 3 неплохо, так что я сейчас делаю, но если я выберу инструменты для моего проекта Fresh Spring, скажите, пожалуйста, сразу же. :-)

В любом случае, я создал сущность, которую я хочу проверить, но я не уверен, как на самом деле запустить Testng из весеннего контекста. Я создал простой тестовый класс

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 импортирует бобы для настройки модели и бизнес -уровня. Во-первых, я бы хотел, чтобы он использовал ApplicationContext.xml из Project/WebRoot/Web-Inf, тогда как источник этого теста жизни в Project/SRC/COM/MyDomain/Data/Entities/Test, но я считаю, что это /applicationcontext.xml даст мне проекты/SRC, так же, как ClassPath: это правильно?

Кроме того, теперь, когда я использую модель и бизнес -слои, которые будет использовать мое веб -приложение, я должен ожидать, что она будет вести себя аналогичным образом. Но когда я запускаю Testng на тесте, это SAIS: Class org.hibernate.cfg.extendedMappings имеет интерфейс org.hibernate.cfg.mappings как супер класс:

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>
Это было полезно?

Решение

Теперь проблема, похоже, не связана с ни с одной из Spring или Testng. Ключевая часть:

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

Вы уверены, что с вашей точки зрения в порядке? Т.е. у вас есть совместимая версия модулей Hibernate и нет повторений?

Что если вы создаете простой тест Testng, который выполняет следующее:

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

?

Другие советы

Ваш тест CKAS должен расширить AbstractTestngspringContextTests. Анкет Или если ваш код тестирует базу данных, еще один полезный класс для расширения AbstractTransActionalTStngSpringContextTests.

Проконсультируйтесь с главой по тестированию в весенней документации:

Для меня эта проблема была вызвана потому, что у меня были разные версии с зимней спячкой, а не из -за третьей стороны, включая их. Стоит развертка вашего проекта/POM, чтобы вы убедились, что вы используете только одну версию Hibernate.

Возможно, вы захотите попробовать Hibernate-annotation-35.0-бета-1, поскольку это соответствует Hibernate-Cor-Core-3.5.0-бета-1.

Я все еще получаю java.lang.incompatiblaclaschangeerror, так как я пытаюсь использовать Hibernate Search, который использует «старые» аннотации.

Кроме того, не уверен, что вы запускаете JBoss, но если вы есть, вы получите эту ошибку с Core 3.5.0.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top