零XML配置測試Spring&Hibernate應用

openkk 12年前發布 | 25K 次閱讀 Spring JEE框架

我很熱衷于在編譯器和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原創翻譯/原文鏈接

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!