2015-11-03 64 views
0

请查看该项目:https://github.com/darzz/boot_bug 这是最简单的设置,它重现了错误。* .hbm.xml映射文件未在测试中加载

描述: 应用程序堆栈是弹簧启动与春季数据和弹簧批。 有testNamedQuery.hbm.xml文件在src/main/resources/queries

当从应用类批处理作业成功完成,在日志中没有异常运行。然而,从ApplicationNotWorking类,这是完全相同的副本,只是把测试源根目录中运行时,批处理作业失败:

Caused by: org.hibernate.MappingException: Named query not known: findPersonNames 
    at org.hibernate.internal.AbstractSessionImpl.getNamedQuery(AbstractSessionImpl.java:177) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 
    at org.springframework.batch.item.database.HibernateItemReaderHelper.createQuery(HibernateItemReaderHelper.java:146) ~[spring-batch-infrastructure-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.batch.item.database.HibernateItemReaderHelper.getForwardOnlyCursor(HibernateItemReaderHelper.java:123) ~[spring-batch-infrastructure-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.batch.item.database.HibernateCursorItemReader.doOpen(HibernateCursorItemReader.java:185) ~[spring-batch-infrastructure-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:144) ~[spring-batch-infrastructure-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    ... 39 common frames omitted 

所以看起来是运行测试时,* .hbm .xml文件未加载! 经过研究和调试后,我想我可能会发现原因 - 持久性单元根URL是针对测试目标/测试类设置的,但映射文件位于/ target/classes中。

在我看来,可能的原因可能类似于什么在这里http://blog.carbonfive.com/2007/05/17/using-classpath-vs-classpath-when-loading-spring-resources/

描述,但我不知道,如何解决在春季启动这个问题,而不只是为了测试目的创建的persistence.xml配置。不想将主/资源中的* .hbm.xml文件复制到测试/资源中。

有没有人有想法?

回答

0

,如果你想测试过程中加载的所有资源/豆,你应该写测试以不同的方式比你有

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Application.class) 
@TransactionConfiguration(defaultRollback = true) 
@Transactional 
public class DummyTest{ 

    @Test 
    public void test(){ 
     // 
    } 
} 

应该加载所有的资源与HBM映射

+0

嗨,不幸的是,这不是解决方案。我知道这是编写测试的正确方法,但是在任何情况下都存在问题。 – darzz

0

尝试增加@EnableJpaRepositories(basePackages="com.example.your.package")在您的存储库或您的配置类。