如题,本人使用Spring提供的:AbstractTransactionalDataSourceSpringContextTests类对Service层进行测试。测试的方法是向数据库中插入一条用户记录,然后再重新检索出来。代码如下:
【1】DAO层代码:
[code="java"]
public User saveUser(User newUser) {
getHibernateTemplate().save(newUser);
//getHibernateTemplate().flush();
return (User) getHibernateTemplate().get(User.class,
newUser.getUserId());
}
[/code]
【2】Service层代码:
[code="java"]public User saveUser(User newUser) throws NewsletterException {
try {
return userDao.saveUser(newUser);
} catch (HibernateObjectRetrievalFailureException he) {
throw new ServiceException(systemMessage.getMessage(SERVICE_FAILED)
+ ": saveUser");
} catch (Exception e) {
throw new NewsletterException(e.getMessage());
}
}[/code]
[code="java"]public User getUserByName(String userName) throws NewsletterException {
try {
return userDao.getUserByName(userName);
} catch (HibernateObjectRetrievalFailureException he) {
throw new ServiceException(systemMessage.getMessage(SERVICE_FAILED)
+ ": userName");
} catch (Exception e) {
throw new NewsletterException(e.getMessage());
}
}[/code]
【3】测试代码:
[code="java"]public void testSaveUser() {
User newUser = createUser();
try {
userService.saveUser(newUser);
assertTrue(true);
String sql = "Select USERNAME from NEWSLETTER_USER where UPPER(USERNAME)= ?";
String userName = (String) jdbcTemplate.queryForObject(sql,
new Object[] { "PAUL" }, java.lang.String.class);
assertNotNull(userName);
assertEquals(userName, newUser.getUserName());
} catch (NewsletterException ne) {
fail(ne.getMessage());
[/code] }
}
【4】Spring配置文件:
[code="xml"]
<bean id="userServiceTarget"
class="com.newsletter.service.impl.UserServiceImpl">
<property name="userDao">
<ref local="userDao" />
</property>
<property name="systemMessage">
<ref local="systemMessage" />
</property>
</bean>
<!-- Transactional proxy for the User Service -->
<bean id="userService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager" />
</property>
<property name="target">
<ref local="userServiceTarget" />
</property>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
[/code]
【5】测试问题:
[color=red]1. 使用上面的测试代码,发现jdbcTemplate.queryForObject方法获取到的结果为空,测试失败。
在testSaveUser方法末尾,即便加上setComplete()方法,发现数据已经插入,但query方法同样返回NULL
假如我使用上面Service层的userService.getUserByName方法进行测试,测试通过
假如我在DAO层的saveUser方法里面加上getHibernateTemplate().flush();测试也通过[/color]
[b]请问为什么即便我在测试方法中加上setComplete(),而且数据库中查到了记录,但每次都是返回NULL是什么原因?[/b]
[b]问题补充:[/b]
谢谢llade,假如我调用了setComplete()方法,Spring确实是提交了事务的,因为我在数据库中已经查询到相应的记录。
我测试过3种情况的setComplete(),第一种是在saveUser调用之后,第二种是在queryForObject之后,第三种是分别在saveUser和queryForObject之后。
但每次都是同样的结果。