日常啰嗦
前一篇文章《Spring+SpringMVC+MyBatis+easyUI整合优化篇(三)代码测试》讲了不为和不能两个状态,针对不为,只能自己调整心态了,而对于不能,本文会结合一些实例进行讲解,应该可以使得你掌握单元测试的方法。篇幅所限,所以先写三个类型的测试实例,首先是自己平时写着玩儿的测试类,然后分别是针对数据层和业务层的测试,代码都已经上传到github上了。
我的github地址
简单的测试
我们可能常常会碰到这种事情,需要实现一个功能的时候,忽然想不起来该用什么方法了,或者忽然忘记一个方法该怎么用了,这个时候我可能会查一下API然后写一个简单的测试方法,并没有明确的要去测试什么功能,只是简单的验证一个函数的用法,或者自己实在不确定一个方法该怎么用了,用这种方式加深一下印象。
// 得到MD5加密的内容
@Test
public void md5Test() {
System.out.println(MD5Util.MD5Encode("ssm-maven-secret", "UTF-8"));
//83d8d99f45f62461cc7b7ee76b448cb0
}
// 通过substring()获取文件名
@Test
public void subStringTest() {
//通过substring()获取文件名
String url = "https://s.doubanio.com/f/shire/5522dd1f5b742d1e1394a17f44d590646b63871d/pics/book-default-medium.gif";
url = url.substring(url.lastIndexOf("/") + 1);
System.out.println(url);
//book-default-medium.gif
}
这个只是自己的个人习惯,记忆力有时候真的差。
数据层单元测试
针对书籍模块的测试类,讲解在代码中:
@RunWith(SpringJUnit4ClassRunner.class) //指定测试用例的运行器 这里是指定了Junit4
@ContextConfiguration("classpath:applicationContext.xml")//装配Spring
public class BookDaoTest {
//自动注入,需要将BookDao纳入到Spring容器的管理下,不然会报错
@Autowired
private BookDao bookDao;
@Test
public void getBookByIdTest() {
Book book1 = bookDao.getBookById("1");
Assert.assertEquals(book1, null);//判断两个参数是否相同,返回true的话则测试通过,不然控制台会亮红灯。
Book book2 = bookDao.getBookById("1002");
Assert.assertEquals(book2.getTitle(), "材料成型概论");
// Assert.assertEquals(book2.getTitle(), "我随便写一个");
//写了三个断言,可以分别进行测试,也可以根据上面三个断言自己编写测试。
}
}
针对书籍模块的测试类,讲解也都在代码中:
@RunWith(SpringJUnit4ClassRunner.class) //指定测试用例的运行器 这里是指定了Junit4
@ContextConfiguration("classpath:applicationContext.xml")
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
//默认回滚,即此类中的方法即使执行成功,数据也并不会真正的修改,方法执行后会回滚。
//因为对数据库的增删改都会回滚,因此便于测试用例的循环利用
//前面书籍模块的测试由于只有查询方法所以没有加这个注解。
//如果想看到数据库中的数据随着测试而发生变化可以去掉这个注解。
public class UserDaoTest {
@Autowired
//自动注入,需要将BookDao纳入到Spring容器的管理下
private UserDao userDao;
@Test
public void loginTest() {
User user = new User();
user.setUserName("admin");
user.setPassword("123456");
//断言此姓名和密码的用户为空
//密码并没有加密,所以登录失败,返回的用户对象为空。
Assert.assertEquals(userDao.login(user), null);
User user2 = new User();
user2.setUserName("admin");
user2.setPassword(MD5Util.MD5Encode("123456", "UTF-8"));
//断言此姓名和密码的用户可以登录成功,且用户id为2
Assert.assertTrue(userDao.login(user2).getId() == 2);
//执行下面这个断言则会报错。
//Assert.assertTrue(userDao.login(user2).getId() == 3);
}
@Test
public void findUsersTest() {
//断言此时返回的用户列表数大于0
Assert.assertTrue(userDao.findUsers(null).size() > 0);
//断言此时返回的用户列表数等于3,数字你可以随便写,用户数可能是错的,如果报错你会看到控制台一片红色
Assert.assertTrue(userDao.findUsers(null).size() == 3);
}
@Test
public void getTotalUserTest() {
Assert.assertTrue(userDao.getTotalUser(null) > 0);
Assert.assertTrue(userDao.getTotalUser(null) == 3);
}
//使用update、insert、delete方法时,会得到一个返回值,这个返回值说明了执行一条sql语句后,表中有多少条记录被影响了。
//比如用update修改一条记录,如果修改成功了,返回值为1,返回0则是修改失败。
@Test
public void updateUserTest() {
User user = new User();
user.setId(51);
user.setPassword("1221");
//大于0的意思是成功修改了一条记录,即修改成功,如果updateUser()方法返回值等于0,即修改失败
Assert.assertTrue(userDao.updateUser(user) > 0);
User user2 = new User();
user2.setId(1000);
user2.setPassword("234y9823y89hhao");
Assert.assertTrue(userDao.updateUser(user2) > 0);
}
@Test
public void addUserTest() {
User user = new User();
user.setUserName("测试用户");
user.setPassword(MD5Util.MD5Encode("testuser", "UTF-8"));
//大于0的意思是影响了数据库中的一条记录,即添加成功
Assert.assertTrue(userDao.addUser(user) > 0);
}
@Test
public void deleteUserTest() {
Assert.assertTrue(userDao.deleteUser(51) > 0);
}
}
大家可以将代码pull到本地进行测试,并根据上面几个方法写一下自己的测试用例。
service的单元测试
其实service层的单元测试和dao层并没有太多区别,唯一的不同可能就是service层方法中可以执行多条sql语句,而dao层的方法只能执行一条sql语句,因此这个例子更侧重于讲一下事务问题。
配置文件:
<!-- 配置事务通知属性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 定义事务传播属性 -->
<tx:attributes>
<!--事务切面中insert开头的方法会被纳入事务管理中-->
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="upd*" propagation="REQUIRED"/>
</tx:attributes>
......
</tx:advice>
<!-- 配置事务切面 -->
<aop:config>
<aop:pointcut id="serviceOperation"
expression="(execution(* com.ssm.maven.core.service.*.*(..)))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"/>
</aop:config>
业务方法:
//通过Spring的配置文件,此方法已经纳入到其事务管理下
//发生异常时会触发事务回滚,数据不会被更改
public int insertStore(Store store) {
int level = Integer.valueOf(store.getLevel());
for (int i = 1; i < level; i++) {
store.setLevel(i + "");
storeDao.insertStore(store);
}
store.setLevel(level + "");
int result = storeDao.insertStore(store);
int i = 10 / 0;
//发生异常,操作回滚.
//可以试着将上面一条语句注释掉再运行测试用例,看看有什么区别。
return result;
}
测试用例:
@RunWith(SpringJUnit4ClassRunner.class) //指定测试用例的运行器 这里是指定了Junit4
@ContextConfiguration("classpath:applicationContext.xml")
//@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
//不添加此设置,测试service层的事务管理
//service层与dao层的测试时相同的,不同之处,在于service层多数都会在配置文件中配置spring的事务管理
public class StoreServiceTest {
@Autowired
private StoreService storeService;
@Test
public void insertStoreTest() {
Store store = new Store();
store.setLevel("5");
store.setNumber("TEST");
storeService.insertStore(store);
int i = 10 / 0;
//这里发生异常是不会回滚的,因为此方法并没有被纳入事务管理中
}
}
这个例子可能有些简单,一般业务层方法都会较为复杂,如下:
function(){
-A-
SQL1
-B-
SQL2
-C-
SQL3
-D-
}
那么执行此方法时,无论在A处、B处、C处、D处发生异常,都会触发事务回滚,关于Spring的事务管理及事务传播属性,想了解的可以自己去查询一下。
总结
本篇主要讲了数据层和业务层的测试,下一篇主要会讲一下controller控制层的测试,睡觉啦...
相关推荐
完善的Spring+SpringMVC+Mybatis+easyUI后台管理系统(RESTful API+redis).zip 完善的Spring+SpringMVC+Mybatis+easyUI后台管理系统(RESTful API+redis).zip 完善的Spring+SpringMVC+Mybatis+easyUI后台管理系统...
这是一个基于Java技术栈的Web应用开发整合包,主要包含了Spring、SpringMVC、MyBatis、Maven和easyUI这五个关键组件。下面将详细解释这些技术及其整合方式。 **Spring框架**:Spring是一个全面的Java企业级应用开发...
基于Spring+SpringMVC+Mybatis+easyUI实现的后台管理系统,可用作管理系统开发模板 项目经过严格测试,确保可以运行! 功能简介 本项目实现了一个简单的后台管理系统,可以作为ssm项目学习的脚手架,主要包含以下...
Spring+SpringMVC+MyBatis+Shiro+MySQL+Redis+Maven+EasyUI+Bootstrap实现的通用权限管理系统。 Spring+SpringMVC+MyBatis+Shiro+MySQL+Redis+Maven+EasyUI+Bootstrap实现的通用权限管理系统 Spring+SpringMVC+...
【Spring+SpringMVC+Mybatis+easyUI】是一个经典的Java Web开发框架组合,广泛应用于企业级应用系统中。这个组合提供了模型-视图-控制器(MVC)架构模式的实现,以及数据库操作的便捷支持和用户界面的美化。下面我们...
Spring+SpringMVC+MyBatis+Maven+EasyUI是一个经典的Java Web开发技术栈,广泛应用于企业级应用系统开发。这个技术组合提供了完整的后端服务处理、前端展示以及项目构建管理的能力。以下是对这些技术及其整合方式的...
基于spring+springMVC+mybatis+easyui技术实现的医药后台管理系统 项目描述 基于spring+springMVC+mybatis+easyui技术实现的医药管理系统 运行环境 jdk7+tomcat7+mysql+eclipse/IntelliJ IDEA+maven 项目技术...
在IT行业中,构建Web应用程序是一项常见的任务,而SSM(Spring、SpringMVC、MyBatis)框架组合是Java开发中的主流选择。本项目利用这三个框架与前端的EasyUI库协同工作,创建出一个功能丰富的应用程序。在此,我们将...
本文将详细解析"Spring+SpringMVC+MyBatis+EasyUI demo实例程序",帮助开发者了解和掌握这四个技术的整合应用。 首先,Spring框架的核心在于IoC(Inversion of Control)和AOP(Aspect-Oriented Programming)。IoC...
这是一个基于Java技术栈的Web应用实例,整合了Maven、Spring、SpringMVC、Mybatis、Log4j和EasyUI1.3.2,并且采用了Oracle数据库。让我们逐一解析这些技术及其在项目中的作用。 **Maven**: Maven是一个项目管理和...
在本项目中,"Spring+SpringMVC+Mybatis+Maven+bootstrap+ajax+jQuery整合开发简单的员工后台管理系统",我们看到一个基于Java技术栈的Web应用开发实例。这个系统利用了多个核心技术来构建一个功能完备的员工管理...
这个整合涵盖了四个主要的技术栈,分别是Spring、SpringMVC、Mybatis和EasyUI,每个部分都有其独特的功能和重要性。 **Spring框架**是整个应用程序的基础,它是一个轻量级的容器,提供了依赖注入(DI)和面向切面...
"SpringMvc + Spring + MyBatis + EasyUI"的组合是经典的Java Web开发架构,它提供了完整的功能支持,包括控制层、业务层、持久层以及前端展示。下面我们将详细探讨这些组件的核心知识点: 1. **Spring MVC**:...
● 实现方法: 使用MySQL 建立数据库。服务端使用SSM框架(Spring+SpringMVC+MyBatis)+shiro+Maven,使用Myeclipse进行开发。前端使用MUi和HUI框架和vue(与后台交互模板)和Html5+css3来实现移动端App的开发。
在"Java Spring SpringMVC+MyBatis+Maven+easyUI整合代码"项目中,开发者可能需要做以下工作: 1. 配置SpringMVC和MyBatis的集成,定义数据源、事务管理器以及Mapper接口。 2. 创建SSM(Spring-SpringMVC-MyBatis)...
在"Spring+SpringMVC+MyBatis+Maven+easyUI整合代码(2017年4月12日)"这个项目中,开发者已经完成了上述的整合工作,你可以下载"ssm-maven"压缩包,查看并学习整个项目的结构和配置,加深对SSM整合的理解。...
一个SSM(Spring+SpringMVC+Mybatis)+jQuery EasyUI开发的ERP系统
采用easyui+shiro+springmvc+spring+mybatis+mysql easyui作视图层 shiro作权限控制 springmvc作控制层 spring作容器与事务管理 mybatis作数据访问层 mysql作数据存储