Проверка и пружина 3
-
19-09-2019 - |
Вопрос
Как лучше всего провести модульное тестирование с весной? Я предполагаю, что комбинация 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.