【问题标题】:JUnit returns error creating bean with name 'sessionFactory' defined in URLJUnit 返回错误创建具有在 URL 中定义的名称“sessionFactory”的 bean
【发布时间】:2015-09-09 02:05:45
【问题描述】:

我是 JUnit 的新手。为了试验它,我想测试一个 Spring 的存储库类。它只有一种方法用于根据提供的 id 检索行,但我收到异常。我发现解决问题的一种方法是添加一个上下文类,但我不确定这是否有帮助,如果有帮助,不知道该怎么做。另一个问题是我想运行测试用例时需要运行项目吗?!!

例外

 java.lang.IllegalStateException: Failed to load ApplicationContext
            at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:94)
            at org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:72)
            at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(
            .........
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'Table1RepositoryImpl': 
Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not 
autowire field: private org.hibernate.SessionFactory com.myproject.repository.Table1RepositoryImpl.sessionFactory; nested 
exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in URL 
[file:WebContent/WEB-INF/my-servlet.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: 
javax.persistence.OneToMany.orphanRemoval()Z
        at 
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(
        ....
    Caused by: org.springframework.beans.factory.BeanCreationException: 
Could not autowire field: private org.hibernate.SessionFactory 
com.myproject.repository.Table1RepositoryImpl.sessionFactory; nested 
exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'sessionFactory' defined in URL [file:WebContent/WEB-INF/my-servlet.xml]: Invocation of init method 
failed; nested exception is java.lang.NoSuchMethodError:
javax.persistence.OneToMany.orphanRemoval()Z
    ....
    Caused by: org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'sessionFactory' defined in URL 
[file:WebContent/WEB-INF/my-servlet.xml]: Invocation of init method 
failed; nested exception is java.lang.NoSuchMethodError: 
javax.persistence.OneToMany.orphanRemoval()Z
        ......
    Caused by: java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z
        at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:2021)
        at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:895)
        at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:728)
        at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3625)
        at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3579)
        at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1381)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1786)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1870)
        at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:372)
        at org.springframework.orm.hibernate4.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:454)
        at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:439)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1625)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1562)
        ... 53 more

JUnit 测试用例

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"file:WebContent/WEB-INF/my-servlet.xml"})  
public class Table1RepositoryTests {

    @Autowired
    private Table1Repository table1Repository;

    private Table1 table1;

    @Before
    public void setup(){
        table1 = new Table1();
        table1.setDescription("This is row 1 of table 1");
        table1.setId(1);
    }

    @Test
    public void shouldReturnFirstRowOfTable1(){
        Table1 result = table1Repository.retrieveTableById(1);
        assertEquals(result,table1);
    }

}

更新

看来我应该注入 SessionFactory 对象。正如我的存储库类中有以下行。

    @Autowired
    private SessionFactory sessionFactory;

我还发现link 后面写着 “例如,不要编写发出 HTTP 请求、访问数据库或从文件系统读取的单元测试。”应该测试我的存储库代码是否正常工作?

【问题讨论】:

    标签: java spring hibernate spring-mvc junit


    【解决方案1】:
    1. 您可以使用HSQLDB 来测试存储库代码。 HSQLDB 可以作为内存模式使用,每次运行 UnitTest 时都会重新构建。
    2. 恕我直言,建议只测试单个类。因此,您最好模拟 sessionFactory 并使其在 Table1RepositoryTests 中返回您想要的任何内容。
    3. 如果你真的想测试spring的注入逻辑,用sessionFactory测试Table1RepositoryImpl,你可以在代码中使用@RunWith(SpringJUnit4ClassRunner.class)语法。例外是因为no such method orphanRemovalGoogle 你可以在stackoverflowblog 找到答案

    【讨论】:

      猜你喜欢
      • 2018-04-25
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 2014-07-18
      相关资源
      最近更新 更多