テストとスプリング3
-
19-09-2019 - |
質問
春にユニットテストを行うためのベストプラクティスの方法は何ですか? Spring 3との組み合わせのTestngとJmockitの組み合わせは悪くないので、それが私が今やっていることですが、新鮮なSpringプロジェクトのツールを選択している場合は、すぐに教えてください。 :-)
とにかく、私はテストしたいエンティティを作成しましたが、春のコンテキストからテストを実際に実行する方法がわかりません。簡単なテストクラスを作成しました
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を使用して、モデルとビジネス層をセットアップするための豆のインポート。まず、Project/Webroot/Web-INFのApplicationContext.xmlを使用してもらいたいのに対し、このテストのソースはProject/SRC/MyDomain/Data/Entities/Testに存在しますが、私はそれを信じています。 /applicationContext.xmlは、ClassPathと同じプロジェクト/SRCを提供します:これは正しいですか?
さらに、Webアプリケーションが使用するモデルとビジネスレイヤーを使用しているので、同様に動作することを期待する必要があります。しかし、テストでtestngを起動すると、sais:class org.hibernate.cfg.extendedmappingsには、interface 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
これは何ですか、そしてなぜ私はこれを手に入れているのですか?手がかりはありますか?
私のSessionFactoryはこのように見えます
<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
あなたのクラスパスは大丈夫ですか?つまり、Hibernateモジュールの互換性のあるバージョンがあり、繰り返しはありませんか?
以下を実行する簡単なテストを作成した場合はどうなりますか:
Class.forName("org.hibernate.cfg.ExtendedMappings");
?
他のヒント
テストCKASSが拡張する必要があります AbstractTestNgSpringContextTests. 。または、コードがデータベースACCEをテストしている場合、拡張する別の便利なクラスは AbstractTransactionAltestngspringContextTests.
私にとって、この問題は、彼らを含む第三者のためではなく、私自身が異なる冬眠バージョンを含めていたために引き起こされました。 YouSerlfが1つのHibernateバージョンのみを使用していることを確認するためのプロジェクト/POMのスイープは価値があります。
hibernate-core-3.5.0-beta-1と揃っているので、Hibernate-Annotations-3.5.0-beta-1を試してみてください。
「古い」注釈を使用している冬眠検索を使用しようとしているため、Java.lang.incompatibleclasschangeerrorを時々取得します。
また、JBossを実行しているかどうかはわかりませんが、Core 3.5.0でこのエラーが発生します。