Mockito
- Mockito简介
- Maven依赖
- 实际使用场景
- 相关注意点
1.Mockito简介
- 是什么--用 Java 编写的用于单元测试的最流行的 Mocking 框架
- 在哪里 --mockito维护地址
https://github.com/mockito/mockito
2.Maven依赖(Java)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
</dependency>
3.实际使用场景
-
研发阶段针对相关需求开发的代码进行针对性的mock模拟测试
-
针对单项目修改 但是存在多项目依赖的情况可以使用该框架进行数据模拟
代码块中相关名词解释
@Mock--用户对主体服务中需要调用的对象进行标注,用于生成虚拟对象
@Mock(lenient = true)--标注该虚拟对象可多次调用多次使用
@BeforeAll--在执行对应的测试方法前 提前调用做一些初始化工作
given(api.xxx()).willReturn(response)--针对某个方法的调用设定返回值
静态参数调用-即api.xxx(Request request)方法内的逻辑依赖于入参
given(api.xxx(Mockito.any(xxx.class)).willReturn(response)
动态参数调用-即api.xxx(Request request)方法中的参数在逻辑中依赖前后关系生成,即不关注动态调用中的参数结构 构造具体的response信息
Assertions.assertEquals(a,b)--断言校验a值和b值是否相等
@Mock注解标注的api+given()方法结合使用
1.等同于不调用given()虚拟对象的具体方法中的信息
2.willReturn用于定义返回体,便于真实待测试方法使用该返回体往后执行
@RunWith(MockitoJUnitRunner.Silent.class)
@Slf4j
@ExtendWith(MockitoExtension.class)
class MockServiceTest {
public SpringUtil springUtil;
@Mock
private AccountApi accountApi;
@Mock
private ProductApi productApi;
@Mock
private NotifyApi notifyApi;
@Mock(lenient = true)
public static DefaultListableBeanFactory factory;
private static final Long ACCOUNT_ID = 1L;
private static final Long PRODUCT_ID = 2L;
private static final Long NOTIFY_ID = 3L;
@BeforeAll
static void setup(){
log.info("Setup Ok");
}
private MockService createService(){
return new MockService(accountApi,productApi,notifyApi);
}
@Test
void addAccount(){
springUtil = new SpringUtil();
springUtil.postProcessBeanFactory(factory);
//mock data
Account acount = Account.builder().id(ACCOUNT_ID).build();
AccountDetailReponse accountDetailResponse = AccountDetailReponse.builder().account(new Account()).build();
//mock response
AccountResponse accountResponse = AccountResponse.builder().status(AccountEnum.SUCCESS).build();
ProductResponse productResponse = ProductResponse.builder().product(new Product()).build();
//static mock
given(accountApi.selectById(ACCOUNT_ID)).willReturn(accountDetailResponse);
//dynamic mock
given(productApi.products(Mockito.any(Product.class))).willReturn(productResponse);
//invoke method--> check success
MockService service = createService();
AddAccountRequest request = new AddAccountRequest();
AddResponse response = service.addAccount(request);
//check
Assertions.assertEquals(accountResponse.getStatus(),response.getStatus());
}
}
4.相关注意点
-
初始化报错问题--整个方法中存在部分属性未使用相关注解标注 可把类的Publicquch
-
微服务多模块互相依赖--需要提前mock相关依赖 否则无法完成单服务的单元测试
-
需要注意逻辑 很多时候的报错是因为相关参数的定义顺序和定义方式不同(注意点参照上方备注名词解释)