只有testAddUserWhenUserAbsent一个能通过, 其他的均不能通过, 都是internalAddUser之后,TestCase.assertNotNull(user.getId());失败, 如果我不用AbstractTransactionalJUnit4SpringContextTests的话可以,用了就不行, 但是要回滚数据库,所以没有办法啊, 不知道什么原因
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:dao-spring-context.xml")
public class NgTrackerUserDaoTest extends AbstractTransactionalJUnit4SpringContextTests {    @Resource
    private TrackerUserDAO trackerUserDAO;    private NgTrackerUser internalAddUser(String loginId, String password
            , String firstName, String lastName, Date registerDate) {
        NgTrackerUser user = new NgTrackerUser();
        user.setLoginId(loginId);
        user.setPassword(password);
        user.setFirstName(firstName);
        user.setLastName(lastName);
        user.setRegisterTime(registerDate);        trackerUserDAO.addUser(user);        return user;
    }    @Test
    public void testAddUserWhenUserAbsent() throws Exception {
        NgTrackerUser user = trackerUserDAO.getUser("user001");        TestCase.assertNull(user);        internalAddUser("user001", "89767", "jerry", "chen", new Date());        user = trackerUserDAO.getUser("user001");        TestCase.assertNotNull(user);
    }    @Test(expected = DuplicateKeyException.class)
    public void testAddUserWhenUserExists() {
        NgTrackerUser user = internalAddUser("user002", "88888", "shrek", "lee", new Date());
        TestCase.assertNotNull(user);        internalAddUser("user002", "88888", "shrek", "lee", new Date());
    }    @Test
    public void testGetUserById() throws Exception {        NgTrackerUser user = internalAddUser("user003", "76567", "tree", "chow", new Date());        TestCase.assertNotNull(user.getId());        user = trackerUserDAO.getUserById(user.getId().intValue());        TestCase.assertNotNull(user);
    }    @Test
    public void testDelUser() throws Exception {
        NgTrackerUser user = internalAddUser("user004", "9999", "jetty", "tai", new Date());        TestCase.assertNotNull(user.getId());        trackerUserDAO.deleteUser(user);        user = trackerUserDAO.getUser("user004");        TestCase.assertNull(user);
    }    @Test
    public void testUpdateUser() throws Exception {        NgTrackerUser user = internalAddUser("user005", "479161", "chart", "pai", new Date());        TestCase.assertNotNull(user.getId());        user.setAlertEmail("[email protected]");
        trackerUserDAO.updateUser(user);        user = trackerUserDAO.getUser("user005");        TestCase.assertEquals(user.getAlertEmail(), "[email protected]");
    }
}只有testAddUserWhenUserAbsent一个能通过, 其他的均不能通过, 都是internalAddUser之后,TestCase.assertNotNull(user.getId());失败, 如果我不用AbstractTransactionalJUnit4SpringContextTests的话可以,用了就不行, 但是要回滚数据库,所以没有办法啊, 不知道什么原因Springspring

解决方案 »

  1.   

    dao-spring-context.xml 如下<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="location" value="classpath:c3p0.properties"/>
        </bean>    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
            <property name="driverClass"><value>${c3p0.driverClass}</value></property>
            <property name="jdbcUrl"><value>${c3p0.jdbcUrl}</value></property>
            <property name="user"><value>${c3p0.user}</value></property>
            <property name="password"><value>${c3p0.password}</value></property>        <property name="minPoolSize"><value>${c3p0.minPoolSize}</value></property>
            <property name="maxPoolSize"><value>${c3p0.maxPoolSize}</value></property>
            <property name="maxIdleTime"><value>${c3p0.maxIdleTime}</value></property>
            <property name="acquireIncrement"><value>${c3p0.acquireIncrement}</value></property>
            <property name="maxStatements"><value>${c3p0.maxStatements}</value></property>
            <property name="initialPoolSize"><value>${c3p0.initialPoolSize}</value></property>
            <property name="idleConnectionTestPeriod"><value>${c3p0.idleConnectionTestPeriod}</value></property>
            <property name="acquireRetryAttempts"><value>${c3p0.acquireRetryAttempts}</value></property>
            <property name="breakAfterAcquireFailure"><value>${c3p0.breakAfterAcquireFailure}</value></property>
            <property name="testConnectionOnCheckout"><value>${c3p0.testConnectionOnCheckout}</value></property>
        </bean>    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource" />
        </bean>    <bean id="transactionInterceptor"
              class="org.springframework.transaction.interceptor.TransactionInterceptor">
            <property name="transactionManager" ref="transactionManager" />
            <property name="transactionAttributes">
                <props>
                    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
                    <prop key="select*">PROPAGATION_REQUIRED,readOnly</prop>
                    <prop key="add*">PROPAGATION_REQUIRED</prop>
                    <prop key="insert*">PROPAGATION_REQUIRED</prop>
                    <prop key="update*">PROPAGATION_REQUIRED</prop>
                    <prop key="delete*">PROPAGATION_REQUIRED</prop>
                    <prop key="remove*">PROPAGATION_REQUIRED</prop>
                </props>
            </property>
        </bean>    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
            <property name="beanNames">
                <list>
                    <value>*DAO</value>
                </list>
            </property>
            <property name="interceptorNames">
                <list>
                    <value>transactionInterceptor</value>
                </list>
            </property>
        </bean>    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="configLocation"  value="classpath:dao-mybatis-config.xml" />
        </bean>    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
            <constructor-arg index="0" ref="sqlSessionFactory" />
        </bean>    <bean id="trackerDeviceDAO" class="com.topflytech.gps.dao.impl.NgTrackerDeviceDAO">
            <property name="sqlSession" ref="sqlSession"/>
        </bean>    <bean id="trackerEventDAO" class="com.topflytech.gps.dao.impl.NgTrackerEventDAO">
            <property name="sqlSession" ref="sqlSession"/>
        </bean>    <bean id="trackerPositionDAO" class="com.topflytech.gps.dao.impl.NgTrackerPositionDAO">
            <property name="sqlSession" ref="sqlSession"/>
        </bean>    <bean id="trackerUserDAO" class="com.topflytech.gps.dao.impl.NgTrackerUserDAO">
            <property name="sqlSession" ref="sqlSession"/>
        </bean>
    </beans>