声明:
Author:赵志乾
Date:2017-7-30
Declaration:All Right Reserved!!!
Java的泛型系统同动态反射API的结合并不好。对于JMock而言,这就意味着当我们模拟泛型类的时候,编译器会报出静态类型错误警告,但是这种警告本不应该报出。为此我们通过在声明的Mock对象上添加注解来压制此类警告。下面以一个例子进行说明:
有一个泛型接口如下:
public interface Juicer<T extends Fruit> { Liquid juice(T fruit); }
在测试中,我们想mock这个接口,如下:
Juicer<Orange> orangeJuicer = context.mock(Juicer<Orange>.class, "orangeJuicer"); Juicer<Coconut> coconutJuicer = context.mock(Juicer<Coconut>.class, "coconutJuicer");
但这在Java语法中是不正确的。事实上,我们应该写成如下形式:
Juicer<Orange> orangeJuicer = (Juicer<Orange>)context.mock(Juicer.class, "orangeJuicer"); Juicer<Coconut> coconutJuicer = (Juicer<Coconut>)context.mock(Juicer.class, "coconutJuicer");
虽然上面的这种写法在语法和语义上是正确的,但依然会产生泛型安全警告。为了避免这些警告,需要在声明Mock对象时使用@SuppressWarnings进行注解。如下例所示:
@SuppressWarnings("unchecked") Juicer<Orange> orangeJuicer = context.mock(Juicer.class, "orangeJuicer"); @SuppressWarnings("unchecked") Juicer<Coconut> coconutJuicer = context.mock(Juicer.class, "coconutJuicer");
注:本博客中的实例代码均来自于JMock Cookbook。