Mockito是GitHub上使用最广泛的Mock框架,并与JUnit结合使用。
Mock是运行在服务端上的,Mock的作用就是模拟客户端的行为
区别在于Mock省去了网络请求的环节,提高了测试的效率
其次Mock是用编码实现的自动化的单元测试。
- 使用到的注解
- @RunWith(MockitoJUnitRunner.class):测试类上的注解,启动注解
- @InjectMocks:将mock对象注入(直接使用其方法)
- @Mock :mock对象,打桩方法,返回打桩值。其余方法不调用,返回空(配合打桩方法语句一起使用)
- @Spy :mock对象,打桩方法,返回打桩值。其余方法调用真实方法
@RunWith(MockitoJUnitRunner.class)
@Slf4j
public class xxxTest {
@InjectMocks
private xxBizServiceImpl BizService;
@Mock
private xxService Service;
@Before
public void before(){
MockitoAnnotations.initMocks(this);
}
- 打桩方法
- when…thenReturn 当调用指定方法时,返回指定结果
- doAnswer…when 配合InvocationOnMock 当调用指定方法时,动态获取参数和结果
对于打桩的特别解释:
mock 模拟 List(接口) 的对象,拥有 List(接口) 的所有方法和属性。when(xxxx).thenReturn(yyyy); 是指定当执行了这个方法的时候,返回 thenReturn 的值,相当于是对模拟对象的配置过程,为某些条件给定一个预期的返回值。
- 验证方法
- Assert 判断逻辑
- Verify 验证是否调用某个方法(几次)
- 实例对象的测试方式
@Test
public void function_test(){
final xxBO xxBo = default_BO();
//Mock
PowerMockito.when(xxService.selectByPrimaryKey(Mockito.anyLong())).thenReturn(xxBo);
//Invoke
xxBO funxxBo = xxBizService.selectByPrimaryKey(1L);
//Verify
Mockito.verify(xxService).selectByPrimaryKey(Mockito.anyLong());
Assert.assertEquals("xx必须相等","在结果中取某一项预期值value",xxBo.getxx());
}
如果在单元测试中经常会使用的POJO对象,可以进行统一示例,后面直接进行调用即可:
private xxBO default_BO() {
xxBO xxBo = new xxBO ();
xxBo .setxx();
...
return xxBo;
}
测试对象也可以传入json文件:
//Fill Data
List<xxBO> default_list = JsonUtil.readJsonFileToList("json/xx/xx.json", xxBO.class);
PageInfo<xxBO> xxPageInfo = new PageInfo<>(default_list );
xxPageInfo .setTotal(default_list .size());
如果执行过程中遇到一些我们不关心的方法,但是需要依赖这些方法返回的结果,才能验证自己的代码逻辑。那么可以通过mock工具来返回结果。最后通过assert或者Verify来验证是否符合自己的想法
参考链接:
Mockito(1)
Mockito(2)