2012-11-21 67 views
1

您好我有一個單元測試應該測試的cronjob彈簧非事務性單元測試和休眠

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "file:WebContent/WEB-INF/applicationContext.xml" }) 
@TransactionConfiguration(transactionManager = "hibernateTransactionManager") 
@Transactional 
public class cronTest {} 

但由於的cronjob沒有看到測試的數據交易。但是,當我刪除@Transactional休眠說:

org.hibernate.HibernateException: No Session found for current thread 

,當我用我自己的

sessionFactory.getCurrentSession().getTransaction().commit(); 
sessionFactory.getCurrentSession().beginTransaction(); 

測試提交末

org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started 

失敗,我怎樣才能得到一個單元測試沒有交易?

該測試是否成才這樣的:

userDao.clear(); 
    loadeduser = userService.getUserById(createUser.getUserID()); 
    assertTrue(loadeduser.getAuthoritiesEntities().contains(adminRole)); 
    assertTrue(loadeduser.getAuthoritiesEntities().contains(userRole)); 

    // Wait for auto unsign 
    TestUtils.sleep(10000); 

    userDao.clear(); 
    loadeduser = userService.getUserById(createUser.getUserID()); 
    assertFalse(loadeduser.getAuthoritiesEntities().contains(adminRole)); 
    assertTrue(loadeduser.getAuthoritiesEntities().contains(userRole)); 

它檢查是否過期角色的自動unsign工作,石英作業每5秒

+0

你可以添加crontTest()的更多內容嗎?我希望看到正在測試的主題的方法調用以及sessionFactory方法的位置。 – Jay

回答

1

通常我會建議使用單元測試代碼可以在單個事務中進行測試,並進行集成測試(啓動完整系統並執行您想要測試的序列)來測試多事務行爲。

但是要回答這個問題:解決方法之一是從測試方法中刪除@Transaction,但不是直接進行測試方法控制事務,而是讓您測試的方法開始/提交他們自己的交易(他們通常會做什麼,對吧?)

例如,我們可能有通過正常DAO工作流程運行的測試,並且每個DAO方法都標記爲@Transactional。每種方法都控制着自己的事務提交,因此我們可以在單個測試方法中測試多事務行爲。該測試可能是這樣的:

// no @Transactional here, dao methods are @Transactional 
public void testMultiTransactionUpdate() { 
    Entity t = dao.getEntity(id); 
    t.setProperty("somethingnew"); 
    dao.update(t); 
    Entity t2 = dao.getEntity(id); 
    Assert.assertEquals(t1.getProperty(), t2.getProperty()); 
} 

有一點要小心的是,如果你是犯有危害的內存數據庫(例如HSQLDB),在一次測試中進行了變更,將不會自動回滾和通常在隨後的測試中可見。在測試結束時,您必須手動撤消所有更改,或確保您的測試數據不會干擾其他不那麼容易的測試。這就是爲什麼我會謹慎使用這種技術。

+0

您好我需要這樣的測試,因爲我想確保石英配置正確。我打電話的服務是事務性的,但沒有在測試中的交易,我得到「org.hibernate.HibernateException:沒有發現當前線程的會話」 – wutzebaer

+0

你可以添加測試代碼到你的問題?測試中的某些內容正在調用需要打開會話的代碼,我看不到那是什麼。通常,仔細將@Transactional放置在服務方法上就足夠了。 – Jay

+0

或者,您可以在您的測試中保留Transactional並將DefaultRollback = false添加到您的TransactionConfiguration中,然後在After annotaed方法中測試您想要測試的內容。在這種情況下,你可能希望這是班上唯一的考試。 – Jay