零XML配置测试Spring&Hibernate应用

openkk 12年前

我很热衷于在编译器和IDE的支持下通过移除XML文件来提升Spring3的开发效率,而这并不会改变Spring给你提供的强大的功能。

没有XML配置文件的Hibernate的单元测试是可行的,但是竟然花了我好一会才找到所有的东西,所以就在这里写下来。

我将在一个使用@Configuration注解的类中初始化所有的bean。

@Configuration  @EnableTransactionManagement  public class TestRepositoryConfig {   @Bean    public DataSource dataSource() {    return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2)      .setName("Nuts").build();   }     @Bean    public LocalSessionFactoryBean sessionFactoryBean() {    LocalSessionFactoryBean result = new LocalSessionFactoryBean();    result.setDataSource(dataSource());    result.setPackagesToScan(new String[] { "pl.squirrel.testnoxml.entity" });      Properties properties = new Properties();    properties.setProperty("hibernate.hbm2ddl.auto", "create-drop");    result.setHibernateProperties(properties);    return result;   }     @Bean    public SessionFactory sessionFactory() {    return sessionFactoryBean().getObject();   }     @Bean    public HibernateTransactionManager transactionManager() {    HibernateTransactionManager man = new HibernateTransactionManager();    man.setSessionFactory(sessionFactory());    return man;   }     @Bean    public OrderRepository orderRepo() {    return new OrderRepository();   }  }

测试类是这样的:

@RunWith(SpringJUnit4ClassRunner.class)  @TransactionConfiguration(defaultRollback = true)  @ContextConfiguration(classes = { TestRepositoryConfig.class })  @Transactional  public class OrderRepositoryTest {   @Autowired   private OrderRepository repo;     @Autowired   private SessionFactory sessionFactory;     @Test    public void testPersistOrderWithItems() {    Session s = sessionFactory.getCurrentSession();      Product chestnut = new Product("Chestnut", "2.50");    s.save(chestnut);    Product hazelnut = new Product("Hazelnut", "5.59");    s.save(hazelnut);      Order order = new Order();    order.addLine(chestnut, 20);    order.addLine(hazelnut, 150);      repo.saveOrder(order);    s.flush();      Order persistent = (Order) s.createCriteria(Order.class).uniqueResult();    Assert.assertNotSame(0, persistent.getId());    Assert.assertEquals(new OrderLine(chestnut, 20), persistent      .getOrderLines().get(0));    Assert.assertEquals(new OrderLine(hazelnut, 150), persistent      .getOrderLines().get(1));   }  }

这里有几个需要注意的细节:

  • 我在测试上使用了@Transactional注解,然后我将可以直接访问Session。
  • 如果测试没有使用@Transactional注解,事务将总是忽略掉@TransactionConfiguration提交。
  • 如果测试使用了@Transactional注解,@TransactionConfiguration将被视为默认配置。即使他被忽略了,在test执行最后的时候事务也将回滚,如果你想让他提交,就是用@TransactionConfiguration(defaultRollback=false).
  • 对于不同的生产环境而言,测试的@Configuration可能都不同,我这里使用的是嵌入式的H2数据库,对于真实的应用我将在测试数据库上使用相同的引擎。
大家也都看到了,仅仅就两个java类,没有XML。你可以通过这里查看我在Github上托管的 代码。你也可以完善它。

 

OSChina.NET原创翻译/原文链接