原文: http://jmockit.org/tutorial/Faking.html#mocks
该API针对一个类的部分方法或构造函数mock场景使用,特别是在与外部交互的依赖,如邮件或调用外部服务的类
mock-up class
继承mockit.MockUp的类,泛型T就是要被mock的类,一般以静态嵌套类,内部类或匿名类方式在测试类中声明
嵌套类
A nested class is any class whose declaration occurs within the body of another class or interface. A top level class is a class that is not a nested class.
参考 http://www.cnblogs.com/aigongsi/archive/2012/04/24/2467183.html
匿名类
Anonymous classes enable you to declare and instantiate a class at the same time.
参考 http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
mock method
使用@Mock注解与需要mock的方法上,且该方法名必须在原类中存在
构造函数使用$init
标识
若方法不存在或参数不正确将抛出异常IllegalArgumentException
非public方法能否mock
一样mock:methods with private, protected or “package-private” accessibility, static methods, final methods, and native methods.
在定义mockup类方法时候可以不带修饰符,改mock应该只关注方法标识符,不关注修饰符,这个可以待验证
例子
public final class MockLoginContext extends MockUp<LoginContext>
{
@Mock
public void $init(String name, CallbackHandler callback)
{
assertEquals("test", name);
assertNotNull(callback);
}
@Mock
public void login() {}
@Mock
public Subject getSubject() { return null; }
}
当要fake某个类只在单个测试用例中使用时,推荐使用匿名类
@Test
public void applyingAnAnonymousMockup() throws Exception
{
new MockUp<LoginContext>() {
@Mock void $init(String name) { /* do nothing */ }
@Mock void login() {}
});
new LoginContext("test").login();
}