为了展示这个特性,参考下面这个例子:
public interface Service { int doSomething(); }
final class ServiceImpl implements Service { public int doSomething() { return 1; } }
public final class TestedUnit
{
private final Service service1 = new ServiceImpl();
private final Service service2 = new Service() { public int doSomething() { return 2; } };
public int businessOperation() {
return service1.doSomething() + service2.doSomething();
}
}
我们想要测试的businessOperation(),使用了实现了接口Service的两个类。一个类还是内部类。这样的内部类实现,从客户代码是无法访问到的,除非使用反射。
已知一个基础类型(接口、抽象类、其他)我们还是可以伪造其相关的实现或继承的类。通过一个类型变量,我们可以创建一个目标类型引用基础类型的伪造。这种伪造不仅对JVM中已经加载的实现类有效,对测试运行期间被加载的同样有效。这种能力在下面的代码中展现:
@Test
public <T extends Service> void fakingImplementationClassesFromAGivenBaseType() {
new MockUp<T>() {
@Mock int doSomething() { return 7; }
};
int result = new TestedUnit().businessOperation();
assertEquals(14, result);
}
上面的测试中,所有针对实现了Service#doSomething方法的调用都会被导向伪造方法的实现,忽略对接口方法的实际实现。