2016-04-10 33 views
4

我运行一个JUnit集成测试与配置,像这样的内存数据库H2:JUnit的多线程测试与Spring的事务中

@Bean 
public DataSource dataSource() { 

    try { 
     SimpleDriverDataSource simpleDriverDataSource = new SimpleDriverDataSource(); 
     simpleDriverDataSource.setDriverClass((Class<? extends Driver>) ClassUtils.forName("org.h2.Driver", this.getClass().getClassLoader())); 
     simpleDriverDataSource.setUrl("jdbc:h2:file:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false;MVCC=true;FILE_LOCK=NO;mv_store=false"); 
     simpleDriverDataSource.setUsername("sa"); 
     simpleDriverDataSource.setPassword(""); 

     return simpleDriverDataSource; 
    } catch(ClassNotFoundException e) { 
     throw new IllegalStateException(e.getMessage()); 
    } 

} 

试验使得对服务方法的调用。此服务方法使用执行程序服务来分解处理。在调用服务类之前,测试方法会将一些数据插入到数据库中,并且可以使用服务(通过JPA存储库调用)读取此数据,直到将任务提交给执行程序服务。但是,运行任务时,无法读取之前保存的数据。

如何让分叉的线程看到持久数据?

注意:这只是单元测试失败,它在运行时工作正常。

回答

2

假设您的测试是@Transactional,您所看到的是预期行为,因为您(通常)不希望测试所做的更改对系统的其他部分可见,并且可能会在测试结束。

一个简单的方法来解决这个问题是注释@Test方法这样

我已经能够重现旅游行为不propagation = Propagation.NEVER并看到它与它解决。

请注意,您必须将数据库还原到一个干净的状态运行测试后,手动,或通过该测试所做的更改,将可见于其他测试