繁体   English   中英

JUnit返回在URL中定义名称为'sessionFactory'的bean创建错误

[英]JUnit returns error creating bean with name 'sessionFactory' defined in URL

我是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;

我还发现以下链接显示“例如,不要编写发出HTTP请求,访问数据库或从文件系统读取的单元测试”。 那我应该如何测试我的存储库代码是否正常工作?

  1. 您可以使用HSQLDB测试存储库代码。 HSQLDB可以用作内存模式,并在每次运行UnitTest时重新构造。
  2. 恕我直言,建议仅测试各个类。 因此,您最好模拟sessionFactory并使其返回Table1RepositoryTests中所需的任何内容。
  3. 如果您确实要测试spring的注入逻辑,并使用sessionFactory测试Table1RepositoryImpl,则可以在代码中使用语法@RunWith(SpringJUnit4ClassRunner.class)。 例外是因为no such method orphanRemoval 谷歌它你可以在stackoverflow博客中找到答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM