强大的Mockito测试框架 (二)
ocks的问题是:如果被测试类是代理类,那么注入会失效。比如上面的UserService如果是事务或者其他AOP代理类,那么进入@Test方法时UserService中的DAO属性不会被Mock类替换。
3有些方法想Mock定制,有些想调用真实方法
因为@Mock针对接口生成Mock类,所以我们是没法调用到真实的实现类的方法。可以使用@Spy注解标注属性,并且标注@Resource注解让Spring注入真实实现类,那么Mockito就会自动生成Spy类。
例如:
@InjectMocks
@Resource(name ="userService")
privateUserService userService;
@Spy
@Resource
privateUserDao userDao;
Spy类就可以满足我们的要求。如果一个方法定制了返回值或者异常,那么就会按照定制的方式被调用执行;如果一个方法没被定制,那么调用的就是真实类的方法。
如果我们定制了一个方法A后,再下一个测试方法中又想调用真实方法,那么只需在方法A被调用前,调用Mockito.reset(spyObject);就行了。
[java]
import static org.mockito.Mockito.when;
import org.mockito.Mockito;
public class TestMockObject implementsITestMock {
publicstatic void main(String[] args) {
ITestMockmock = Mockito.mock(TestMockObject.class);
System.out.println(mock.test1());
System.out.println(mock.test2());
ITestMockspy = Mockito.spy(new TestMockObject());
System.out.println(spy.test1());
System.out.println(spy.test2());
when(spy.test1()).thenReturn(100);
System.out.println(spy.test1());
Mockito.reset(spy);
System.out.println(spy.test1());
System.out.println(spy.test2());
when(spy.test1()).thenReturn(104);
System.out.println(spy.test1());
}
@Override
publicint test1() {
System.out.print("RealTest1()!!! - ");
return1;
}
@Override
publicint test2() {
System.out.print("RealTest2()!!! - ");
return2;
}
}
import static org.mockito.Mockito.when;
import org.mockito.Mockito;
public class TestMockObject implementsITestMock {
publicstatic void main(String[] args) {
ITestMockmock = Mockito.mock(TestMockObject.class);
System.out.println(mock.test1());
System.out.println(mock.test2());
ITestMockspy = Mockito.spy(new TestMockObject());
System.out.println(spy.test1());
System.out.println(spy.test2());
when(spy.test1()).thenReturn(100);
System.out.println(spy.test1());
Mockito.reset(spy);
System.out.println(spy.test1());
System.out.println(spy.test2());
when(spy.test1()).thenReturn(104);
System.out.println(spy.test1());
}
@Override
publicint test1() {
System.out.print("RealTest1()!!! - ");
return1;
}
@Override
publicint test2() {
System.out.print("RealTest2()!!! - ");
return2;
}
}
输出为:
0
0
Real Test1()!!! - 1
Real Test2()!!! - 2
Real Test