在Spring中进行集成测试详解

在单元测试时,我们尽量在屏蔽模块间相互干扰的情况下,重点关注模块内部逻辑的 正确性。而集成测试则是在将模块整合在一起后进行的测试,它的目的在于发现一些模块 间整合的问题。有些功能很难通过模拟对象进行模拟,相反它们往往只能在真实模块整合 后,才能真正运行起来,如事务管理就是其中比较典型的例子。

按照Spring的推荐(原话:You should not normally use the Spring container for unit tests: simply populate your POJOs in plain JUnit tests!),在单元测试 时,你不应该依赖于Spring容器。换言之,你不应该在单元测试时启动 ApplicatonContext并从中获取Bean,相反你应该通过模拟对象完成单元测试。而集成测 试的前提则是事先装配好模块和模块之间的关联类,如将DAO层真实的UserDao和 LoginLogDao装配到UserServiceImpl再进行测试。具体装配工作是在Spring配置文件中完 成的,因此在一般情况下,集成测试需要启动Spring容器,你可以在测试类中简单地从 Spring容器中取出目标Bean进行测试。

需要测试的业务接口

假设我们的应用中拥有一个UserService业务层接口,它拥有4个业务方法,其代码如 下所示:

代码清单1 UserServie接口

package com.baobaotao.service;
import com.baobaotao.domain.User;
import org.springframework.transaction.annotation.Transactional;
@Transactional
public interface UserService {
boolean hasMatchUser(String userName,String password);
User findUserByUserName(String userName);
void loginSuccess(User user);
void registerUser(User user);
}

我们通过UserServiceImpl对UserService提供了实现:

代码清单2 UserServiceImpl实现UserService接口

package com.baobaotao.service;
import com.baobaotao.dao.LoginLogDao;
import com.baobaotao.dao.UserDao;
import com.baobaotao.domain.LoginLog;
import com.baobaotao.domain.User;
public class UserServiceImpl implements UserService {
private UserDao userDao;
private LoginLogDao loginLogDao;
public boolean hasMatchUser(String userName, String password) {
int matchCount =userDao.getMatchCount(userName, password);
return matchCount > 0;
}
public User findUserByUserName(String userName) {
return userDao.findUserByUserName(userName);
}
public void loginSuccess(User user) {
user.setCredits( 5 + user.getCredits());
LoginLog loginLog = new LoginLog();
loginLog.setUserId(user.getUserId());
loginLog.setIp(user.getLastIp());
loginLog.setLoginDate(user.getLastVisit());
userDao.updateLoginInfo(user);
loginLogDao.insertLoginLog(loginLog);
}
public void setLoginLogDao(LoginLogDao loginLogDao) {
this.loginLogDao = loginLogDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}

UserServiceImpl引用了两个DAO层的类(UserDao和LoginLogDao)共同实现 UserService的接口,在UserServiceImpl开放使用之前,我们有必须对其进行集成测试, 以保证实现逻辑的正确性。

时间: 2025-01-08 20:39:54

在Spring中进行集成测试详解的相关文章

Spring中属性注入详解_java

本文演示了int.String.数组.list.set.map.Date等属性的注入. 其中Date类型的注入则是借助了Spring提供的属性编辑器来实现的,首先是用到的五个实体类 package com.jadyer.model; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; /** * 常见属性的注入 * @see 包括int,String,Array,lis

Spring中的AOP详解

本文摘自pandonix的博客.   此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没有遇到过与之相关的问题.最近项目中遇到了以下几点需求,采用AOP来解决.一方面是为了以更加灵活的方式来解决问题,另一方面是借此机会深入学习Spring AOP相关的内容.本文是权当本人的自己AOP学习笔记,以下需求不用AOP肯定也能解决,至于是否牵强附会,仁者见仁智者见智. 面对需求: ①对部分函数的调用进行日志记录,用于观察特定问题在运行过程中的函数调用情况. ②监控部分重要函数,若抛出指定的异

Spring中的Scope详解

spring 默认scope 是单例模式 这样只会创建一个Action对象 每次访问都是同一个Action对象,数据不安全 struts2 是要求 每次次访问 都对应不同的Action scope="prototype" 可以保证 当有请求的时候 都创建一个Action对象   <bean id="meetAction" class="com.web.actions.MeetsAction"   scope="prototype&

Spring Boot 集成 FreeMarker 详解案例

转载自 并发编程网 - ifeve.com一.Springboot 那些事 SpringBoot 很方便的集成 FreeMarker ,DAO 数据库操作层依旧用的是 Mybatis,本文将会一步一步到来如何集成 FreeMarker 以及配置的详解: Springboot 那些事: 系类文章: <Spring Boot 之 RESRful API 权限控制> <Spring Boot 之 HelloWorld详解> <Springboot 整合 Mybatis 的完整 We

Java 中的注解详解及示例代码_java

在Java中,注解(Annotation)引入始于Java5,用来描述Java代码的元信息,通常情况下注解不会直接影响代码的执行,尽管有些注解可以用来做到影响代码执行. 注解可以做什么 Java中的注解通常扮演以下角色 编译器指令 构建时指令 运行时指令 其中 Java内置了三种编译器指令,本文后面部分会重点介绍 Java注解可以应用在构建时,即当你构建你的项目时.构建过程包括生成源码,编译源码,生成xml文件,打包编译的源码和文件到JAR包等.软件的构建通常使用诸如Apache Ant和Mav

Hibernate配置文件中映射元素详解

详解 本文中将讲述Hibernate的基本配置及配置文件的应用,这对于正确熟练使用Hibernate是相当关键的. 配置文件中映射元素详解 对象关系的映射是用一个XML文档来说明的.映射文档可以使用工具来生成,如XDoclet,Middlegen和AndroMDA等.下面从一个映射的例子开始讲解映射元素,映射文件的代码如下. <?xml version="1.0"?><!--所有的XML映射文件都需要定义如下所示的DOCTYPE.Hibernate会先在它的类路径(c

java-在myeclipse中svn使用详解

问题描述 在myeclipse中svn使用详解 在myeclipse中svn使用详解.比如:标记为合并是在什么情况下用, 覆盖更新:在什么情况下使用等等. 本人对svn不是很了解,尤其是在有冲突文件的时候. 说的尽量详细点... 请各位大神指教~~~ 解决方案 如何在MyEclipse下集成SVN详解如何在MyEclipse下集成SVN详解MyEclipse中SVN使用步骤 解决方案二: myeclipse6.5集成svn 一.安装方法: 方法一.如果可以上网可在线安装 打开Myeclipse,

c# 怎样读取mobi文件或mobi格式中文文档详解

问题描述 c#怎样读取mobi文件,mobi格式中文文档详解,谁有源码或文档的,先谢过了 解决方案 解决方案二:没人回答?..解决方案三: 解决方案四:好吧我不知道--不过帮你谷歌了--网上没找到--应该是没这需求吧--mobi我记得用在了Kindle上不过应该是可以读的,因为Windows8.1上有读取这个的App,你可以逆向一下--解决方案五:https://mbc.codeplex.com/这里有demo下载看看

ASP 中 DateDiff 函数详解 主要实现两日期加减操作_ASP基础

ASP 中 DateDiff 函数详解DateDiff 函数  描述  返回两个日期之间的时间间隔.  语法  DateDiff(interval, date1, date2 [,firstdayofweek][, firstweekofyear]])  DateDiff 函数的语法有以下参数:  参数 描述  interval 必选.字符串表达式,表示用于计算 date1 和 date2 之间的时间间隔.有关数值,请参阅"设置"部分.  date1, date2 必选.日期表达式.用