springMVC4(6)Unitils断言与整合测试

反射断言

反射对象断言

在实际场景中,我们比较两个对象是否相等,可能会去选择重写equals方法去比较对象里的每一个属性,或者是直接将对象的属性一个个取出来比较,但这都比较麻烦,Unitils为我们提供了反射断言可直接完成这一任务,如下例所示:

@Test
public void test1(){
    User user1 = new User(1,"a","b");
    User user2 = new User(1,"a","b");
    System.out.println(user1 == user2);//false
    ReflectionAssert.assertReflectionEquals(user1, user2);//断言成功
}

断言方法的完整方法签名为:assertReflectionEquals(Object expected, Object actual, ReflectionComparatorMode... modes
第一个参数为期望值,第二个为实际值,第三个为断言模式,有一下三种:

断言模式 说明
ReflectionComparatorMode.LENIENT_ORDER 忽略断言集合或数组中元素的顺序,如list(1,2,3)和list(3,2,1)将视为相等(括号内为集合的值)
ReflectionComparatorMode.IGNORE_DEFAULTS 忽略Java类型默认值,如引用类型为null,整数类型为0,布尔类型为false等如我们只想比较两个用户的id和名称是否相同,而忽略密码比较User("id","name","password"),User("id","name",null)则这两个对象是相等的
ReflectionComparatorMode.LENIENT_DATES 比较两个日期只比较是否都是值,或者都是null的而忽略具体的日期数值

unitils还未我们提供了既忽略顺序、又忽略默认值的断言方法:
.assertLenientEquals(Object expected, Object actual)

反射属性断言

使用方法类似与对象断言,下面是两个实例:

assertPropertyLenEquals("id", 1, user);  //断言user的id属性的值是1
assertPropertyLenEquals("address.street", "First street", user); //断言user的address的street属性

反射属性断言有多种重载方式,下面是两种集合重载,他会比较:集合actualObjects中的所有对象的成员属性propertyName是否和集合actualObjects匹配,这里存在同样存在顺序的问题、默认值、日期数值的断言模式区分。
1. assertPropertyReflectionEquals(String propertyName, Collection<?> expectedPropertyValues, Collection<?> actualObjects, ReflectionComparatorMode... modes)
2. assertPropertyLenientEquals(String propertyName, Collection<?> expectedPropertyValues, Collection<?> actualObjects)
下面是一个实例:

User user1 = new User(2,"a","b");
        User user2 = new User(3,"a","b");
        ReflectionAssert.assertPropertyLenientEquals("id", Arrays.asList(null, 2), Arrays.asList(user1,user2));//true
        //junit.framework.AssertionFailedError: Expected: [3], actual: [2, 3]
        ReflectionAssert.assertPropertyLenientEquals("id", Arrays.asList(3), Arrays.asList(user1,user2));
        ReflectionAssert.assertPropertyLenientEquals("id", Arrays.asList(3,2), Arrays.asList(user1,user2));//true
        //junit.framework.AssertionFailedError: Expected: [3, 4], actual: [2, 3]
        ReflectionAssert.assertPropertyLenientEquals("id", Arrays.asList(3,4), Arrays.asList(user1,user2));

整合spring测试

使用unitils测试能简化我们的测试配置,下面看一个web测试实例:

public class UnitilsTestSpring  extends UnitilsJUnit4{

    @SpringApplicationContext("servlet-context.xml")//初始化spring容器
    private ApplicationContext applicationContext;

    @SpringBeanByType//根据类型注入控制器
    private UserController userController;

    @Test
    public void test1(){
        User user = new User(10,"name","password");
        userController.getUser(user);
        //输出User [id=10, userName=name, password=password]
    }
}

其中注入属性有三种方法,
1. @SpringBeanByType:从Spring容器中加载一个与被注解属性相同类型的Bean,找不到则抛出异常
2. @SpringBeanByName:从Spring容器中加载一个与被注解属性相同名称的Bean
3. @SpringBean(value = “myId”):从Spring容器中加载一个id为myId的Bean

在这里我们针对web层测试而专门提到了RestTemplate和Unitils,它们不仅能完成单元测试,在集成测试方面也十分便利。后面在引入service层和dao层配置后,我们还会引入其他单元测试利器,如mock模拟测试以及DBunit数据库测试等。通过合理的单元测试和集成测试有助于我们实际项目的高效开发。

时间: 2024-12-10 23:15:57

springMVC4(6)Unitils断言与整合测试的相关文章

PHPUnit袖珍指南之自动测试

最好的程序员也会犯错误.好程序员和差程序员的区别在于:好程序员能通过测试尽可能的发现错误.你越快测试错误,你就越快发现它们,发现和修正的成本就越低.这解释了为什么只在软件发布前才测试的做法为什么问题那么多.大多数错误根本就没有发现过,修正发现的错误是那么的高,以至于你不得不根据优先级来决定只修正那些错误,因为你根本就承受不起全部修正的费用. 相比你正在使用的方法,采用PHPUnit进行测试并不是一个全然不同的东西.它们只是方法不同.两者之间的不同在于,检查程序行为是否符合正确是通过一批可以自动测

如何控制服务器虚拟测试环境

虚拟服务器技术被用在试生产环境,目的是节省资金.时间和人力,然而同样的工具如果未经检查就可能会导致结构复杂,资源浪费并使管理难度加大. 行业分析师和IT专业人士说,虚拟化技术解除了物理服务器测试环境的限制,实现了IT员工间的资源共享,这就使得测试工作更容易进行,但却需要进行严格的控制. Forrester调查公司的高级分析师Carey Schwaber说,"在测试环境中采用虚拟化技术的一个缺陷是影像数量的增多,特别是在通过不同操作系统测试多个结构时.环境 的控制工作必须认真进行,必须有相关政策来

我们的测试为什么不够敏捷?

测试是为了保证软件的质量,敏捷测试关键是保证可以持续.及时的对软件质量情况进行全面的反馈.由于在敏捷开发过程中每个迭代都会增加功能.修复缺陷或重构代码,所以在完成当前迭代新增特性测试工作的同时,还要通过回归测试来保证历史功能不受影响.为此我们期望: 测试范围足够广: ● 测试用例要覆盖所有功能: ● 要在各种可能的环境下作兼容性测试: ● 系统的稳定性.性能都要测试: 测试频率足够高: ● 每日构建产生的版本要保证可用: ● 每个迭代都需要对历史功能做回归测试: ● 释放前或上线后如果打了补丁,

【SSH项目实战】国税协同平台-2.环境搭建和整合

框架整合 2.1新建数据库及web项目 2.1.1创建itcastTax数据库 -- 创建数据库 CREATE DATABASE itcastTax DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 我们使用的是Mysql数据库 2.1.2新建web项目 新建工作空间指定项目编码(或工作空间编码)为utf-8,再建 web project,配置buildpath 添加jstl的jar包和mysql驱动包:javax.servlet.jsp.j

如何测试RxJava代码

假设你已经阅读过RxJava的相关内容,也已经体验过像"RxJava入门之实例解析"中的那些示例,现在打算在自己的代码中探索一下响应式编程了.但是,现在却一直困扰着如何测试那些可能会在代码库中发现的新功能呢?下面我们将探索一下如何测试RxJava代码. 本文内容要点: RxJava含有内建的.测试友好的解决方案. 使用TestSubscriber去验证Observable. 使用TestScheduler可实现对时间的严格控制. Awaitility库提供了对测试环境进一步的控制. 使

MyBatis的一级缓存和二级缓存 以及 mybatis和ehcache缓存框架整合

查询缓存 缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题. 基本由此图可以看出,我们在每一层都需要相应的缓存. mybatis持久层缓存 mybatis提供一级缓存和二级缓存 mybatis一级缓存是一个SqlSession级别,sqlsession只能访问自己的一级缓存的数据,二级缓存是跨sqlSession,是mapper级别的缓存,对于mapper级别的缓存不同的sql

MyBatis学习教程(八)-Mybatis3.x与Spring4.x整合图文详解_java

一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: 复制代码 代码如下: mvn archetype:create -DgroupId=me.gacl -DartifactId=spring4-mybatis3 -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false 如下图所示: 创建好的项目如下: 编辑pom.xml文件 <project xmlns="http://maven.apac

1、Android测试入门

编写和运行测试时Android APP开发周期中的重要的一环.好的测试可以让你非常容易的在开发过程中发现bug,提升你对自己代码的自信.使用Android Studio,你可以在物理设备或者虚拟机中运行本地单元测试或者仪表测试(instrumented tests)(仪表测试我自己发明的词汇),这样你就可以分析结果,在开发环境中更改你的代码. 本地单元测试是指无需访问Android Framework或者一台Android 设备,直接在你的开发机器中运行的测试. 仪表测试直接运行在你的设备或者虚

6、Android Content Provider测试

如果你的应用中使用了Content Provider来与其他应用进行数据交互,你需要对Content Provider进行测试来确保正常工作. 创建Content Provider整合测试 在Android中,app将Content Provider视为数据API.一个Content Provider可能会有public 常量. Content Provider允许你访问真实的用户数据,所以必须在一个隔离的测试环境中来测试你的Content Provider.这就意味着你的测试不会更改真实的用户