Jmockit使用详解之Faking
简介
Faking主要用来构造假的实现,通常是部分伪造方法和构造函数,来到得到期望的运行逻辑,常用来伪造第三方组件(发邮件,发请求等)。
伪造方法和类
方法通过@Mock来伪造,被伪造的类只要继承mockit.MockUp< T >就行,这里T是需要被伪造的类
1 | public final class FakeLoginContext extends MockUp<LoginContext> |
当一个类的方法被伪造后,在实际调用过程中,真实类的这些方法将会被替换成伪造类的方法。
注意@Mock标注的方法要和实际该类(或父类,不包括Object类)中的方法签名匹配:对于普通方法,需要名称和参数一致,对于构造函数,只需要构造函数一致,同时名字用”$init”。
如果@Mock的方法在实际类中找不到,将会抛IllegalArgumentException异常。
使用伪造类
伪造类可以作用于整个test类,或者一个test方法,@BeforeClass,@BeforeMethod,@Before,@BeforeEach也可以使用
1 |
|
Faking伪造能力
private,protect,后者包private的类,静态方法,final方法,native方法都可以伪造。甚至 一个静态方法能够被实例方法伪造(伪造类中定义的非静态方法和静态放的签名相同)。需要注意的是抽象方法不能够被伪造。
伪造不确定的类
1 | public interface Service { int doSomething(); } |
给定一个基类,我们可以伪造其所有的实现类(不仅是已经存在,也包括后序创建的)
1 | public <T extends Service> void fakingImplementationClassesFromAGivenBaseType() { |
伪造类初始化
下面的方法可以伪造静态初始化代码块,也包括静态属性:
注意:运行时才有效的静态属性的赋值将会无效(jvm只初始化一次类)
1 |
|
访问调用上下文:
伪造的方法可以有一个多余的Invocation参数,并且作为第一个参数,这个参数在调用的时候将会自动传入。调用的上下文将可以通过该方法获取。比如getInvokedInstance()将会访返回伪造的实例,如果返回null,表明这个方法是静态的。
1 |
|
伪造类中继续调用真实类的方法
1 |
|
伪造的重复使用
在Junit中可以使会用@Before注解
1 | public class MyTestClass |
全局伪造
使用JUnit的Suite方法,在MyFirstTest.class, MySecondTest.class将会有效
1 | (Suite.class) |
添加AOP的advice
1 | public final class MethodTiming extends MockUp<Object> |