Verifications是用于做验证。验证Mock对象(即@Moked/@Injectable@Capturing修饰的或传入Expectation构造函数的对象)有没有调用过某方法,调用了多少次。与Exceptations的写法相似。如下:
new Verifications() { // 这是一个Verifications匿名内部类 { // 这个是内部类的初始化代码块,我们在这里写验证脚本,脚本的格式要遵循下面的约定 //方法调用(可是类的静态方法调用,也可以是对象的非静态方法调用) //times/minTimes/maxTimes 表示调用次数的限定要求。赋值要紧跟在方法调用后面,也可以不写(表示只要调用过就行,不限次数) //...其它准备验证脚本的代码 //方法调用 //times/minTimes/maxTimes 赋值 } }; 还可以再写new一个Verifications,只要出现在重放阶段之后均有效。 new Verifications() { { //...验证脚本 } };
例子:
//Verification的使用 public class VerificationTest { @Test public void testVerification() { // 录制阶段 Calendar cal = Calendar.getInstance(); new Expectations(Calendar.class) { { // 对cal.get方法进行录制,并匹配参数 Calendar.YEAR cal.get(Calendar.YEAR); result = 2016;// 年份不再返回当前小时。而是返回2016年 cal.get(Calendar.HOUR_OF_DAY); result = 7;// 小时不再返回当前小时。而是返回早上7点钟 } }; // 重放阶段 Calendar now = Calendar.getInstance(); Assert.assertTrue(now.get(Calendar.YEAR) == 2016); Assert.assertTrue(now.get(Calendar.HOUR_OF_DAY) == 7); // 验证阶段 new Verifications() { { Calendar.getInstance(); // 限定上面的方法只调用了1次,当然也可以不限定 times = 1; cal.get(anyInt); // 限定上面的方法只调用了2次,当然也可以不限定 times = 2; } }; } }
通常,在实际测试程序中,我们更倾向于通过JUnit/TestNG/SpringTest的Assert类对测试结果的验证, 对类的某个方法有没调用,调用多少次的测试场景并不是太多。因此在验证阶段,我们完全可以用JUnit/TestNG/SpringTest的Assert类取代new Verifications() {{}}验证代码块。
除非,你的测试程序关心类的某个方法有没有调用,调用多少次,你可以使用new Verifications() {{}}验证代码块。
如果你还关心方法的调用顺序,你可以使用new VerificationsInOrder() {{}} .这里就不做详细的介绍了。