九、 验证数据对象
Junit测试框架中Assert类就是断言工具类,主要验证单元测试中实际数据对象与期望数据对象一致。在调用被测方法时,需要对返回值和异常进行验证;在验证方法调用时,也需要对捕获的参数值进行验证。
1. 验证数据对象空值
1) 验证数据对象为空
通过Junit提供的Assert.assertNull方法验证数据对象为空。
2) 验证数据对象非空
通过Junit提供的Assert.assertNotNull方法验证数据对象非空。
2. 验证数据对象布尔值
1) 验证数据对象为真
通过Junit提供的Assert.assertTrue方法验证数据对象为真。
2) 验证数据对象为假
通过Junit提供的Assert.assertFalse方法验证数据对象为假。
3. 验证数据对象引用
在单元测试用例中,对于一些参数或返回值对象,不需要验证对象具体取值,只需要验证对象引用是否一致。
1) 验证数据对象一致
Junit提供的Assert.assertSame方法验证数据对象一致。
2) 验证数据对象不一致
Junit提供的Assert.assertNotSame方法验证数据对象一致。
4. 验证数据对象值
Junit提供Assert.assertEquals、Assert.assertNotEquals、Assert.assertArrayEquals方法组,可以用来验证数据对象值是否相等。
1) 验证简单数据对象
对于简单数据对象(比如:基础类型、包装类型、实现了equals的数据类型……),可以直接通过Junit的Assert.assertEquals和Assert.assertNotEquals方法组进行验证。
2) 验证简单数组或集合对象
对于简单数组对象(比如:基础类型、包装类型、实现了equals的数据类型……),可以直接通过Junit的Assert.assertArrayEquals方法组进行验证。对于简单集合对象,也可以通过Assert.assertEquals方法验证。
3) 验证复杂数据对象
对于复杂的JavaBean数据对象,需要验证JavaBean数据对象的每一个属性字段。
4) 验证复杂数组或集合对象
对于复杂的JavaBean数组和集合对象,需要先展开数组和集合对象中每一个JavaBean数据对象,然后验证JavaBean数据对象的每一个属性字段。
5) 通过序列化验证数据对象
如上一节例子所示,当数据对象过于复杂时,如果采用Assert.assertEquals依次验证每个JavaBean对象、验证每一个属性字段,测试用例的代码量将会非常庞大。这里,推荐使用序列化手段简化数据对象的验证,比如利用JSON.toJSONString方法把复杂的数据对象转化为字符串,然后再使用Assert.assertEquals方法进行验证字符串。但是,序列化值必须具备有序性、一致性和可读性。
通常使用JSON.toJSONString方法把Map对象转化为字符串,其中key-value的顺序具有不确定性,无法用于验证两个对象是否一致。这里,JSON提供序列化选项SerializerFeature.MapSortField(映射排序字段),可以用于保证序列化后的key-value的有序性。
6) 验证数据对象私有属性字段
有时候,单元测试用例需要对复杂对象的私有属性字段进行验证。而PowerMockito提供的Whitebox.getInternalState方法,获取轻松地获取到私有属性字段值。
5. 验证异常对象内容
异常作为Java语言的重要特性,是Java语言健壮性的重要体现。捕获并验证异常数据内容,也是测试用例的一种。
1) 通过@Test注解验证异常对象
Junit的注解@Test提供了一个expected属性,可以指定一个期望的异常类型,用来捕获并验证异常。但是,这种方式只能验证异常类型,并不能验证异常原因和消息。
2) 通过@Rule注解验证异常对象
如果想要验证异常原因和消息,就需求采用@Rule注解定义ExpectedException对象,然后在测试方法的前面声明要捕获的异常类型、原因和消息。
3) 通过Assert.assertThrows验证异常对象
在最新版的JUnit中,提供了一个更为简洁的异常验证方式——Assert.assertThrows方法。