JMokit中的@Mocked与@Injectable区别
官方Tutorials:http://jmockit.org/gettingStarted.html#mockObject
首先,两个注解都可用于测试类成员mock field与参数用例参数mock parameter,对mock field的注解作用于整个测试类,而对mock parameter的注解只针对该测试用例
@Mocked与@Injectable的区别:前者针对类型,后者针对单个实例。
有一个类ToBeMocked,具备一个public方法fun()
public Class ToBeMocked
{
public String fun()
{
return "call original method";
}
}
以下分为四种情况讨论
- @Mocked作用于测试类成员
整个测试类中被mock的类型的所有实例都将被mocked,被mocked的类所有非private方法都将处于mocked状态,被mocked的方法默认返回值null
public class MockedAndInjectableTest1
{
@Mocked
ToBeMocked instance;
@Test
public void test()
{
System.out.println(instance.fun()); //null
ToBeMocked newInstance = new ToBeMocked();
System.out.println(newInstance.fun()); //null
}
}
- @Mocked作用于测试用例参数
该用例参数中被注解的类型将处于mock状态
public class MockedAndInjectableTest
{
@Test
public void test1(@Mocked final ToBeMocked instance)
{
System.out.println(instance.fun()); //null
ToBeMocked newInstance = new ToBeMocked();
System.out.println(newInstance.fun()); //null
}
@Test
public void test2()
{
ToBeMocked newInstance = new ToBeMocked();
System.out.println(newInstance.fun()); //call original method
}
}
- @Injectable作用于测试类成员
被注解的单个实例在整个测试类中将处于mocked状态
public class MockedAndInjectableTest
{
@Injectable
ToBeMocked instance;
@Test
public void test()
{
System.out.println(instance.fun()); //null
ToBeMocked newInstance = new ToBeMocked();
System.out.println(newInstance.fun()); //call original method
}
}
- @Injectable作用于测试类参数
被注解的单个实例在该测试用例中将处于mocked状态
public class MockedAndInjectableTest
{
@Test
public void test1(@Injectable final ToBeMocked instanceA)
{
System.out.println(instanceA.fun()); //null
ToBeMocked newInstance = new ToBeMocked();
System.out.println(newInstance.fun()); //call original method
}
@Test
public void test2()
{
ToBeMocked newInstance = new ToBeMocked();
System.out.println(newInstance.fun()); //call original method
}
}