2012-02-06 47 views
0

本質上是一個有關JUnit測試的問題,您在@Before方法中創建實體但在實際測試方法中找不到它。我一直在試圖找出發生了什麼,任何形式的幫助都會非常感激。測試:在數據庫中創建但未找到的實體

本質上講,它是一個JUnit類是這樣的:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"myConfiFile.xml"}) 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) 
@Transactional 
public class DummyTest { 

@Before 
public void setUp() { 
    // Create an entity here and call .save() 
} 

@Test 
public void testCountMsisdnNumberPlans() { 
    int howManyInstances = dao.countInstancesOfEntity(); 
} 
} 

的DAO代碼非常簡單:

@Transactional(readOnly = true) 
public Integer countInstancesOfEntity(Integer idhlr) { 
   return ((BigDecimal) em.createNativeQuery("SELECT COUNT(*) FROM ENTITY") 
     .getSingleResult()).intValue(); 
} 

在SETUP(),我們創建一個實體,但DAO代碼保持返回0。任何評論都會非常棒。

謝謝。

回答

2

SpringJUnit4ClassRunner執行@Before@After作爲與測試方法相同的事務。因此,在運行測試方法之前,在@Before的持久性上下文中所做的更改不會刷新到數據庫。執行查詢之前的隱式刷新也不會發生,因爲事務被配置爲只讀。

所以,你有幾種選擇:

  • 刪除readOnly = true,它執行查詢之前應啓用自動沖水
  • 添加明確flush()@Before,應該強制刷新即使交易僅
  • 使用@BeforeTransaction而不是@Before。請注意,此方法在事務外運行,因此它不受defaultRollback設置的影響,並且需要手動事務管理。
+0

完全正確。感謝您的幫助。 – Juan 2012-02-07 04:51:15

0

我認爲這是因爲你有defaultRollback = true。

事務被包裹在單獨的方法調用中,在這種情況下,這意味着setUp和您的測試在單獨的事務中。

嘗試將其更改爲false或甚至將其刪除。