pengpenglin 2008-06-19 17:47
浏览 686
已采纳

使用Spring对Service层进行测试,无法查询到刚刚插入的记录?

如题,本人使用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方法获取到的结果为空,测试失败。

  1. 在testSaveUser方法末尾,即便加上setComplete()方法,发现数据已经插入,但query方法同样返回NULL

  2. 假如我使用上面Service层的userService.getUserByName方法进行测试,测试通过

  3. 假如我在DAO层的saveUser方法里面加上getHibernateTemplate().flush();测试也通过[/color]

[b]请问为什么即便我在测试方法中加上setComplete(),而且数据库中查到了记录,但每次都是返回NULL是什么原因?[/b]
[b]问题补充:[/b]
谢谢llade,假如我调用了setComplete()方法,Spring确实是提交了事务的,因为我在数据库中已经查询到相应的记录。

我测试过3种情况的setComplete(),第一种是在saveUser调用之后,第二种是在queryForObject之后,第三种是分别在saveUser和queryForObject之后。

但每次都是同样的结果。

  • 写回答

3条回答 默认 最新

  • hjgundam 2008-06-24 09:41
    关注

    需要将hibernate的session,flush一下
    [code="java"]SessionFactoryUtils.getSession(getSessionFactory(), false).flush()[/code]
    这样你刚才做的操作才会体现在实际的数据库表中。然后通过jdbc就能查到了。

    [code="java"]
    public void testSaveUser() {

    User newUser = createUser();

    try {

    userService.saveUser(newUser);

    [b]SessionFactoryUtils.getSession(getSessionFactory(), false).flush();[/b]
    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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?