三、 定义被测对象
在编写单元测试时,首先需要定义被测对象,或直接初始化、或通过Spy包装……其实,就是把被测试服务类进行实例化。
1. 直接构建对象
直接构建一个对象,总是简单又直接。
2. 利用Mockito.spy方法
Mockito提供一个spy功能,用于拦截那些尚未实现或不期望被真实调用的方法,默认所有方法都是真实方法,除非主动去模拟对应方法。所以,利用spy功能来定义被测对象,适合于需要模拟被测类自身方法的情况,适用于普通类、接口和虚基类。
3. 利用@Spy注解
@Spy注解跟Mockito.spy方法一样,可以用来定义被测对象,适合于需要模拟被测类自身方法的情况,适用于普通类、接口和虚基类。@Spy注解需要配合@RunWith注解使用。
@RunWith(PowerMockRunner.class) public class UserServiceTest { @Spy private UserService userService = new UserService(); ... } |
注意:
@Spy注解对象需要初始化。如果是虚基类或接口,可以用Mockito.mock方法实例化。
4. 利用@InjectMocks注解
@InjectMocks注解用来创建一个实例,并将其它对象(@Mock、@Spy或直接定义的对象)注入到该实例中。所以,@InjectMocks注解本身就可以用来定义被测对象。@InjectMocks注解需要配合@RunWith注解使用。
四、 模拟依赖对象
在编写单元测试用例时,需要模拟各种依赖对象——类成员、方法参数和方法返回值。
1. 直接构建对象
如果需要构建一个对象,最简单直接的方法就是——定义对象并赋值。
2. 反序列化对象
如果对象字段或层级非常庞大,采用直接构建对象方法,可能会编写大量构建程序代码。这种情况,可以考虑反序列化对象,将会大大减少程序代码。由于JSON字符串可读性高,这里就以JSON为例,介绍反序列化对象。
1) 反序列化模型对象
2) 反序列化集合对象
3) 反序列化映射对象
3. 利用Mockito.mock方法
Mockito提供一个mock功能,用于拦截那些尚未实现或不期望被真实调用的方法,默认所有方法都已被模拟——方法为空并返回默认值(null或0),除非主动执行doCallRealMethod或thenCallRealMethod操作,才能够调用真实的方法。
利用Mockito.mock方法模拟依赖对象,主要用于以下几种情形:
• 只使用类实例,不使用类属性;
• 类属性太多,但使用其中少量属性(可以mock属性返回值);
• 类是接口或虚基类,并不关心其具体实现类。
4. 利用@Mock注解
@Mock注解跟Mockito.mock方法一样,可以用来模拟依赖对象,适用于普通类、接口和虚基类。@Mock注解需要配合@RunWith注解使用。
5. 利用Mockito.spy方法
Mockito.spy方法跟Mockito.mock方法功能相似,只是Mockito.spy方法默认所有方法都是真实方法,除非主动去模拟对应方法。
6. 利用@Spy注解
@Spy注解跟Mockito.spy方法一样,可以用来模拟依赖对象,适用于普通类、接口和虚基类。@Spy注解需要配合@RunWith注解使用。
注意:
@Spy注解对象需要初始化。如果是虚基类或接口,可以用Mockito.mock方法实例化。










