接上篇:https://developer.aliyun.com/article/1227512?spm=a2c6h.13148508.setting.23.34364f0esCxN3Z
十二、 消除类型转换警告
在编写测试用例时,特别是泛型类型转换时,很容易产生类型转换警告。常见类型转换警告如下:
作为一个有代码洁癖的轻微强迫症程序员,是绝对不容许这些类型转换警告产生的。于是,总结了以下方法来解决这些类型转换警告。
1. 利用注解初始化
Mockito提供@Mock注解来模拟类实例,提供@Captor注解来初始化参数捕获器。由于这些注解实例是通过测试框架进行初始化的,所以不会产生类型转换警告。
问题代码:
建议代码:
2. 利用临时类或接口
我们无法获取泛型类或接口的class实例,但是很容易获取具体类的class实例。这个解决方案的思路是——先定义继承泛型类的具体子类,然后mock、spy、forClass以及any出这个具体子类的实例,然后把具体子类实例转换为父类泛型实例。
问题代码:
建议代码:
3. 利用CastUtils.cast方法
SpringData包中提供一个CastUtils.cast方法,可以用于类型的强制转换。这个解决方案的思路是——利用CastUtils.cast方法屏蔽类型转换警告。
问题代码:
建议代码:
这个解决方案,不需要定义注解,也不需要定义临时类或接口,能够让测试用例代码更为精简,所以作者重点推荐使用。如果不愿意引入SpringData包,也可以自己参考实现该方法,只是该方法会产生类型转换警告。
注意:
CastUtils.cast方法本质是——先转换为Object类型,再强制转换对应类型,本身不会对类型进行校验。所以,CastUtils.cast方法好用,但是不要乱用,否则就是大坑(只有运行时才能发现问题)。
4. 利用类型自动转换方法
在Mockito中,提供形式如下的方法——泛型类型只跟返回值有关,而跟输入参数无关。这样的方法,可以根据调用方法的参数类型自动转换,而无需手动强制类型转换。如果手动强制类型转换,反而会产生类型转换警告。
问题代码:
建议代码:
其实,SpringData的CastUtils.cast方法之所以这么强悍,也是采用了类型自动转化方法。
5. 利用doReturn-when语句代替when-thenReturn语句
Mockito的when-thenReturn语句需要对返回类型强制校验,而doReturn-when语句不会对返回类型强制校验。利用这个特性,可以利用doReturn-when语句代替when-thenReturn语句解决类型转换警告。
问题代码:
建议代码:
接下篇:https://developer.aliyun.com/article/1227510?groupCode=java