mock出来的对象,所有的属性、方法都会被置空,如果直接调用原本方法,会直接返回返回值类型对应的默认初始值,并不会执行方法体,通过 CallRealMethod 才能调用原方法。
spy出来的对象,是在目标对象或真实对象的基础上进行包装,可以直接调用原方法,不需要借助 CallRealMethod。
mock出来的对象可以使用 when…then… 或 do…when;
spy出来的对象只能使用 do…when,使用 when…then… 不会报错,但会先执行真实方法,再把 thenReturn 的 mock 数据替代原返回值进行返回,没有达到mock的效果。
建议 mock 一律使用 when…then,spy 一律使用 do…when,避免混淆。
package com.haier.baseManage;import com.google.common.collect.Lists;
import com.haier.baseManage.model.dto.module.GreyVersion;
import com.haier.baseManage.service.impl.ModulePcVersionServiceImpl;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;import java.util.ArrayList;
import java.util.List;/*** @author A2001111* @date 2024/10/9 15:33*/
@MockitoSettings(strictness = Strictness.LENIENT)
public class ModulePcVersionServiceTest {@Spy@InjectMocksprivate ModulePcVersionServiceImpl service;// @Mock// private ModulePcVersionMapper mapper;@BeforeEachpublic void init(){MockitoAnnotations.openMocks(this);// Class<?>[] classes = {ModulePcVersionDO.class};// for (Class<?> aClass : classes) {// TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""), aClass);// }// Mockito.when(service.getBaseMapper()).thenReturn(mapper);}@Testpublic void test1(){// spy的方法,使用do.when.methodMockito.doReturn(true).when(service).saveBatch(Mockito.any());List<GreyVersion> greyVersions = new ArrayList<>();GreyVersion greyVersion = new GreyVersion();greyVersion.setAppVersionId(1L);greyVersion.setAsarVersionIds(Lists.newArrayList(1L,2L,3L));greyVersions.add(greyVersion);service.saveModulePcVersion(1L,greyVersions);greyVersion.setAsarVersionIds(null);service.saveModulePcVersion(1L,greyVersions);}}