2014-09-05 86 views
0

是否可以在JUNIT的插入/更新中測試插入?spring + hibernate測試服務/ dao插入

我爲spring-servlet.xml

<context:component-scan base-package="com.isad" /> 
<mvc:annotation-driven /> 

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
<property name="prefix"> 
    <value>/WEB-INF/jsp/</value> 
</property> 
<property name="suffix"> 
    <value>.jsp</value> 
</property> 
</bean> 

<bean id="sessionFactory" scope="singleton" 
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager"/> 
<bean id ="transactionManager" class = "org.springframework.orm.hibernate4.HibernateTransactionManager"> 
<property name = "sessionFactory" ref = "sessionFactory"/> 
</bean> 

我的測試配置:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({"classpath:spring-servlet.xml"}) 
@TransactionConfiguration(transactionManager="transactionManager",defaultRollback=true) 
@Transactional 
public class TestItem { 

@Autowired CategoryService catManager; 

@Test 
public void testItem() { 
    //System.out.println("Begin Test"); 
    Category cat = new Category(); 
    cat.setType(CategoryType.BOOK); 
    cat.setSubCategory("Business Book"); 
    cat.setDescription("One Thing"); 
    catManager.addCategory(cat); 
} 
} 

這是我得到的運行上面的代碼stackstrace:

Hibernate: insert into CATEGORY (DESCRIPTION, SUB_CAT, CAT_TYPE) values (?, ?, ?) 
INFO | 2014-09-04 18:46:50,844 | TransactionalTestExecutionListener.java | 298 | Rolled back transaction after test execution for test context [[email protected] testClass = TestItem, testInstance = [email protected], testMethod = [email protected], testException = [null], mergedContextConfiguration = [[email protected] testClass = TestItem, locations = '{classpath:spring-servlet.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]] 
INFO | 2014-09-04 18:46:50,847 | AbstractApplicationContext.java | 873 | Closing [email protected]372afb: startup date [Thu Sep 04 18:46:48 PDT 2014]; root of context hierarchy 

問題我有插入和更新旁邊,我的其他方法,如刪除工作得很好。

+1

發佈完整堆棧跟蹤 – 2014-09-05 03:30:33

回答

1

您的測試成功了,但由於這是一項測試,並且您指定了defaultRollback=true,所以當測試方法結束時,對數據庫所做的任何更改都會回滾。

我會假設你的服務,你有一個運行COUNT(*)聲明此Category對象 等效的方法。如果你真的想測試您插入成功,請嘗試以下代碼:

@Test 
public void testInsertItem(){ 
    int countPreInsert = catManager.count(); 

    Category cat = new Category(); 
    cat.setType(CategoryType.BOOK); 
    cat.setSubCategory("Business Book"); 
    cat.setDescription("One Thing"); 
    catManager.addCategory(cat); 

    int countPostInsert = catManager.count(); 

    assertEqual("Exactly one record was not inserted in the database", 
     countPreInsert + 1, countPostInsert) 
} 

您不必進行任何清理,因爲TransactionalTestExecutionListener將在測試結束時自動回滾插入語句。

如果要測試更新,請在更新前後進行計數,並斷言它們都相同,以確保Hibernate不會插入或刪除任何記錄。

快樂測試!

+0

對於更新,您還可以使用嵌入式'JdbcTemplate'並執行'queryforMap',它可以爲您提供一個鍵/值對,然後您可以使用該斷言值進行檢查。我總是建議使用另一種方法(JDBC)來測試你的假設,然後你正在使用的假設(JPA/Hibernate),它可能會返回一個正確的結果(由於緩存),但它尚未同步到期缺乏tx設置。 – 2014-09-05 07:04:43

+0

啊,但Hibernate足夠聰明,可以想到這一點。無論何時調用count(*),Hibernate都會將底層會話刷新到數據庫,這樣就不會出現陳舊的結果 – JamesENL 2014-09-05 07:18:37

+0

理論上說,如果開始搞亂flushmodes,hibernate就不再那麼聰明瞭。 – 2014-09-05 07:20:11