spring + hibernate测试服务/ dao插入

时间:2014-09-05 01:51:51

标签: spring hibernate spring-mvc

是否可以在JUNIT中的插入/更新中测试插入?

我的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 [DefaultTestContext@76f3da25 testClass = TestItem, testInstance = com.isad.test.dao.TestItem@376f026, testMethod = testItem@TestItem, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@75905090 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 org.springframework.context.support.GenericApplicationContext@17372afb: startup date [Thu Sep 04 18:46:48 PDT 2014]; root of context hierarchy

我遇到的问题是插入和更新,我的其他方法,如删除工作正常。

1 个答案:

答案 0 :(得分: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不会插入或删除任何记录。

快乐测试!