JMockit官方文档:伪造Facking-part 3 伪造没有指定实现的类

为了展示这个特性,参考下面这个例子:

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方法的调用都会被导向伪造方法的实现,忽略对接口方法的实际实现。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容