Mockito单元测试

Mockito

  1. Mockito简介
  2. Maven依赖
  3. 实际使用场景
  4. 相关注意点
     

  1.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相关依赖 否则无法完成单服务的单元测试

  • 需要注意逻辑 很多时候的报错是因为相关参数的定义顺序和定义方式不同(注意点参照上方备注名词解释)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值