1、@Mocked,标识一个指定的class的实例或被测对象的参数被Mock掉。
除了基本类型和Array,其他所有类型都可以通过@Mocked标识来被Mock掉。当一个被测对象的参数被Mock的时候,执行测试时,该参数将不再按照原有的代码来实例化,而是将实例化的工作委托给JMockit来完成。JMockit根据Expectation方法中的设置来初始化被Mock对象的值。一般来说被测试方法中用到的method会根据Expectation中的设置来进行重写。其他未用到的方法会被初始化为null。
被Mock的对象的除了继承自Object的方法之外的所有方法,包括构造函数、静态函数等都会被JMockit重写。
2、@Capturing,标识一个被Mock的对象,从该对象派生的子类也被Mock了。可以通过maxInstances方法来制定最大有多少层子类也被mock。
3、@Injectable,标识只有一个指定的被测对象的内部变量被mock,其他和被mock实例采用相同对象的实例不受影响。相当于对于被Injectable的class,其构造方法等各种方法仍然采用原有代码来实例化,并未完全委托给JMockit来做。
4、@Tested,标识一个被测对象的实例。通过@Tested标签标识的被测对象实例,将会在测试方法执行之前被初始化。可以通过@Inject注解对被测对象的构造函数进行改写。如果没有@Inject,则采用原有代码进行初始化。如果同时@Tested的fullyInitialized参数被设置成了true,则被测对象的所有参数都需要被初始化成一个合适的值。
例子代码:
public final class ClassUnderTest
{
@Inject private Dependency dependency;
public void doSomething(String someData) { ... }
}
public final class ExampleUnitTest
{
@Tested ClassUnderTest testedUnit;
@Injectable Dependency mockDependency;
@Test
public void exerciseUnitInIsolationFromDependency()
{
Data data = new Data();
new Expectations() {{ mockDependency.findSomeData(anyString); result = data; }};
testedUnit.doSomething("...");
new Verifications() {{ mockDependency.sendNotification(); }};
}
}