当前位置: 首页 > 面试题库 >

TestNG和Spring 3

蓬祺
2023-03-14
问题内容

使用Spring进行单元测试的最佳实践方法是什么?我认为将TestNG和jmockit与Spring
3结合起来还不错,所以这就是我现在正在做的事情,但是,如果我偏离了为新的Spring项目选择工具的范围,请立即告诉我。:-)

无论如何,我已经创建了一个要测试的实体,但是我不确定如何从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导入bean来设置模型和业务层。首先,我希望它使用Project / WebRoot / WEB-
INF中的applicationContext.xml,而此测试的源代码位于Project / src / com / mydomain / data /
entities / test中,但我相信/applicationContext.xml将给我Projects /
src,与classpath相同:这正确吗?

此外,既然我正在使用Web应用程序将使用的模型和业务层,那么我应该期望它的行为类似。但是,当我在测试中启动TestNG时,它说:类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

这是什么,为什么我要得到这个?有什么线索吗?

我的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>

问题答案:

现在问题似乎与Spring或TestNG无关。关键部分是:

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

您确定您的CLASSPATH正常吗?即您具有兼容版本的Hibernate模块,并且那里没有重复内容?

如果您创建一个执行以下操作的简单TestNG测试,该怎么办:

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



 类似资料:
  • 问题内容: 是否有人将Hamcrest与TestNG集成在一起,以便其匹配器可以轻松地用于TestNG断言中? 问题答案: 简而言之,要回答您的问题:您不需要将TestNG与Hamcrest集成。只需直接调用哪个抛出。 背景 我通过Google找到了您的问题,想知道完全一样的问题。在进一步谷歌搜索之后,我没有找到满意的答案,因此我阅读了JUnit与Hamcrest集成的源代码。 对于JUnit,通

  • 故事:因此,我正在运行一个WebDriver2测试套件,其中包含TestNG和捆绑在Maven体系结构中的所有测试套件。我首先在Eclipse项目中构建了所有内容,然后将其转换为Maven项目。我不是一个程序员,但我可以通过Java,我是新的Maven,但对TestNG和Selenium相当好,从我所研究的一切来看,我正确地接近了这一点,我一定错过了一些愚蠢的东西。 问题:我在Eclipse中用M

  • 问题内容: 我正在使用Jenkins构建我的Maven项目并使用插件发布testng结果。报告中的西里尔符号有问题。看起来像: 。但是在Jenkins控制台中的西里尔文输出是可以的。 我的pom.xml: 项目编码设置为UTF-8。IDE是Intellij IDEA 12.1.3。TestNG 6.8.5。 问题答案: 其实, 应该修复它。

  • 我想要一个testNG/cucumber跑步者 我有一系列非Cucumber测试,使用已经使用TestNG框架编写的测试,我希望其中也包含Cucumber代码。 有人想出聪明的办法吗?

  • JUnit 框架是 Java 语言单元测试当前的一站式解决方案。这个框架值得称赞,因为它把测试驱动的开发思想介绍给 Java 开发人员并教给他们如何有效地编写单元测试。但是,在过去的几年中,JUnit 的改进不大;所以,为当今复杂的环境编写测试已经变成一个越来越困难的任务,即 JUnit 必须与其他一些补充性测试框架集成起来。而 TestNG 是一个测试 Java 应用程序的新框架。TestNG

  • 当使用新的测试数据(而不是来自数据提供者的原始数据)重试失败的测试时,我遇到了一个问题。如果我错过了适当的现有主题,请随时为我指出正确的方向。 我发现,如果测试方法失败,也会重试dataprovider方法。如何仅重新运行测试方法(使用原始测试数据)? 提前感谢您的帮助。 以下是我的代码的一些部分: 测试类: RetryTestListener: IRetryAnalyzer: