Mockito单元测试保姆级实战(一个java Mock测试框架)

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


Mockito单元测试保姆级实战

01 Mockito相关

01::01 前期准备

import org.mockito.InjectMocks;
import org.mockito.Mock;
@InjectMocks
ServiceTest serviceTest;
@Mock
ServiceTestMapper mapper;

@Mock:模拟出一个Mock对象,对象是空的,需要指明对象调用什么方法,传入什么参数时,返回什么值
@InjectMocks:依赖@Mock对象的类,也即是被测试的类。@Mock出的对象会被注入到@InjectMocks对象中

01::02 单元测试注解

@RunWith(PowerMockRunner.class)
@PrepareForTest({})
@PowerMockIgnore({"javax.net.ssl.*","javax.management.*"})

01::03 为UT提供框架使用的自动验证

import org.mockito.MockitoAnnotations;
MockitoAnnotations.initMocks(this);

01::04 给测试类中的变量赋值

import org.springframework.test.util.ReflectionTestUtils;
ReflectionTestUtils.setField(serviceTest,"变量名","要赋给该变量的值");

01::05 给测试类中的方法设置返回值

import org.powermock.api.mockito.PowerMockito;
import static org.mockito.ArgumentMatchers.any;
PowerMockito.when(mapper.test(any(String.class))).thenReturn(返回内容)

01::06 给测试类中的方法抛出异常

import org.powermock.api.mockito.PowerMockito;
import static org.mockito.ArgumentMatchers.any;
PowerMockito.when(mapper.test(any(String.class))).thenThrow(new 异常);

01::07 给测试类中的方法设置不返回对象

import org.powermock.api.mockito.PowerMockito;
import static org.mockito.ArgumentMatchers.any;
PowerMockito.doNothing().when(serviceTest).mapper.test(any(String.class));

01::08 Mock方法内部new出来的对象

例子:
File file = new File(path);
file.exists();
单元测试:
File file1 = PowerMockito.mock(File.class);
PowerMockito.whenNew(File.class).withArguments(file).thenReturn(file1);
PowerMockito.when(file1.exists()).thenReturn(true);

01::09 给测试类中的静态类调静态方法提供返回值

测试类头部:
@PrepareForTest({静态类.class})
前期准备:
@Before
public void init(){
PowerMockito.mockStatic(静态类.class);
}
调用:
PowerMockito.when(静态类.静态方法()).thenReturn(返回内容);

02 辅助Mockito

02 ::01 junit常用注解

junit常用注解
@Test(timeout = 10)
测试,该注解必须加到方法上
timeout超时时间,单位是毫秒
终止死循环,当达到设定的值,结束循环
@Ignore
忽略不想被测试的方法,该注解必须加到方法上,也可以加到类上(慎用)
@RunWith(SpringJUnit4ClassRunner.class)
把junit和spring整合到一块,该注解加到类上
@ContextConfiguration(locations = {“classpath:conf/applicationContext.xml”})
用于加载spring配置文件的注解,添加到类上
locations代表spring配置文件路径的数组,数组的类型为Stirng
classpath:这个东西代表从源包下开始寻找
@Resource(name = “blogService”)
注入属性的注解,就相当于set、get方法,name指明bean的id值
@Before
在所有方法之前执行,一般加到方法上
@After
在所有方法之后执行,一般加到方法上
@Transactional
@TransactionConfiguration(transactionManager = “transactionManager”, defaultRollback = true)
上边这俩注解要一块用,用于事物控制,加到类上
transactionManager代表配置文件中事务管理器bean的id值
defaultRollback代表事物回滚,默认值为true,是回滚的

02:02 assert常用方法

Assert.assertEquals(“message”,A,B):
判断对象A和B是否相等,这个判断比较时调用了equals()方法。
Assert.assertSame(“message”,A,B):
判断对象A和B是否相同,使用的是==操作符。
Assert.assertTure(“message”,A):
判断A条件是否为真。
Assert.assertFalse(“message”,A):
判断A条件是否不为真。
Assert.assertNotNull(“message”,A):
判断A对象是否不为null
Assert.assertArrayEquals(“message”,A,B):
判断A数组与B数组是否相等。
等等.............................................

03 实战测试

03::01 要单元测试的实例


import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException; import java.util.Map;

  • <span style="background-color:#f8f8f8"><span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">HttpUtil</span> {
        <span style="color:#770088">private</span>  <span style="color:#008855">String</span> <span style="color:#000000">url</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">""</span>;
    ​
        <span style="color:#aa5500">/**</span>
         <span style="color:#aa5500">* @param param 传参</span>
         <span style="color:#aa5500">* @param heads  自定义请求头</span>
         <span style="color:#aa5500">* @return</span>
         <span style="color:#aa5500">*/</span>
        <span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#000000">httpPost</span>(<span style="color:#008855">String</span> <span style="color:#000000">param</span>, <span style="color:#000000">Map</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span>,<span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">heads</span>) {
              <span style="color:#000000">HttpPost</span> <span style="color:#000000">httpPost</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">HttpPost</span>(<span style="color:#000000">url</span>);
            <span style="color:#000000">RequestConfig</span> <span style="color:#000000">requestConfig</span> <span style="color:#981a1a">=</span> <span style="color:#000000">RequestConfig</span>.<span style="color:#000000">custom</span>().<span style="color:#000000">setSocketTimeout</span>(<span style="color:#116644">60000</span>).<span style="color:#000000">setConnectTimeout</span>(<span style="color:#116644">60000</span>)
                    .<span style="color:#000000">setConnectionRequestTimeout</span>(<span style="color:#116644">60000</span>).<span style="color:#000000">build</span>();
            <span style="color:#000000">httpPost</span>.<span style="color:#000000">setConfig</span>(<span style="color:#000000">requestConfig</span>);
            <span style="color:#000000">httpPost</span>.<span style="color:#000000">setHeader</span>(<span style="color:#aa1111">"Content-Type"</span>, <span style="color:#aa1111">"application/json;charset=UTF-8"</span>);
            <span style="color:#770088">if</span> (<span style="color:#000000">heads</span> <span style="color:#981a1a">!=</span> <span style="color:#221199">null</span>) {
                <span style="color:#000000">heads</span>.<span style="color:#000000">forEach</span>((<span style="color:#000000">k</span>, <span style="color:#000000">v</span>) <span style="color:#981a1a">-></span>
                                      <span style="color:#000000">httpPost</span>.<span style="color:#000000">setHeader</span>(<span style="color:#000000">k</span>, <span style="color:#000000">v</span>));
            }
            <span style="color:#000000">CloseableHttpClient</span> <span style="color:#000000">httpClient</span> <span style="color:#981a1a">=</span> <span style="color:#221199">null</span>;
            <span style="color:#000000">httpPost</span>.<span style="color:#000000">setEntity</span>(<span style="color:#770088">new</span> <span style="color:#000000">StringEntity</span>(<span style="color:#000000">param</span>, <span style="color:#aa1111">"UTF-8"</span>));
            <span style="color:#008855">String</span> <span style="color:#000000">result</span> <span style="color:#981a1a">=</span> <span style="color:#221199">null</span>;
            <span style="color:#770088">try</span>{
                <span style="color:#000000">CloseableHttpResponse</span> <span style="color:#000000">execute</span> <span style="color:#981a1a">=</span> <span style="color:#000000">httpClient</span>.<span style="color:#000000">execute</span>(<span style="color:#000000">httpPost</span>);
                <span style="color:#000000">HttpResponse</span> <span style="color:#000000">response</span> <span style="color:#981a1a">=</span> <span style="color:#000000">execute</span>;
                <span style="color:#000000">HttpEntity</span> <span style="color:#000000">entity</span> <span style="color:#981a1a">=</span> <span style="color:#000000">response</span>.<span style="color:#000000">getEntity</span>();
                <span style="color:#000000">result</span>  <span style="color:#981a1a">=</span> <span style="color:#000000">EntityUtils</span>.<span style="color:#000000">toString</span>(<span style="color:#000000">entity</span>, <span style="color:#aa1111">"UTF-8"</span>);
            }<span style="color:#770088">catch</span> (<span style="color:#000000">IOException</span> <span style="color:#000000">e</span>){
                <span style="color:#000000">e</span>.<span style="color:#000000">printStackTrace</span>();
                <span style="color:#770088">return</span> <span style="color:#221199">null</span>;
            }
    ​
            <span style="color:#770088">return</span> <span style="color:#000000">result</span>;
        }
    ​
    }</span>

03::02 单元测试的实例


import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;

import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.springframework.test.util.ReflectionTestUtils;

import java.io.IOException;

import static org.mockito.ArgumentMatchers.any;

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@RunWith</span>(<span style="color:#000000">PowerMockRunner</span>.<span style="color:#770088">class</span>)
<span style="color:#555555">@PrepareForTest</span>({<span style="color:#000000">HttpClientBuilder</span>.<span style="color:#770088">class</span>, <span style="color:#000000">EntityUtils</span>.<span style="color:#770088">class</span>})
<span style="color:#555555">@PowerMockIgnore</span>({<span style="color:#aa1111">"javax.net.ssl.*"</span>, <span style="color:#aa1111">"javax.management.*"</span>})
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">HttpUtilTest</span> <span style="color:#770088">extends</span> <span style="color:#000000">TestCase</span> {
    <span style="color:#555555">@InjectMocks</span>
    <span style="color:#770088">private</span> <span style="color:#000000">HttpUtil</span> <span style="color:#000000">httpUtil</span>;
    <span style="color:#555555">@Mock</span>
    <span style="color:#000000">CloseableHttpClient</span> <span style="color:#000000">httpClient</span>;
    <span style="color:#555555">@Mock</span>
    <span style="color:#000000">CloseableHttpResponse</span> <span style="color:#000000">response</span>;
    <span style="color:#555555">@Mock</span>
    <span style="color:#000000">HttpEntity</span> <span style="color:#000000">entity</span>;
    <span style="color:#555555">@Mock</span>
    <span style="color:#000000">HttpClientBuilder</span> <span style="color:#000000">httpClientBuilder</span>;
​
    <span style="color:#555555">@Before</span>
    <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">init</span>() <span style="color:#770088">throws</span> <span style="color:#000000">Exception</span> {
        <span style="color:#000000">PowerMockito</span>.<span style="color:#000000">mockStatic</span>(<span style="color:#000000">HttpClientBuilder</span>.<span style="color:#770088">class</span>);
        <span style="color:#000000">PowerMockito</span>.<span style="color:#000000">mockStatic</span>(<span style="color:#000000">EntityUtils</span>.<span style="color:#770088">class</span>);
​
    }
​
    <span style="color:#555555">@After</span>
    <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">tearDown</span>() <span style="color:#770088">throws</span> <span style="color:#000000">Exception</span> {
    }
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* http post 测试方案1.0</span>
     <span style="color:#aa5500">* given 准备测试数据 data</span>
     <span style="color:#aa5500">* when  返回正确的格式</span>
     <span style="color:#aa5500">* input param 传参,heads 自定义请求头</span>
     <span style="color:#aa5500">* then 等值判断</span>
     <span style="color:#aa5500">*</span>
     <span style="color:#aa5500">* */</span>
    <span style="color:#555555">@Test</span>
    <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">httpPost</span>() <span style="color:#770088">throws</span> <span style="color:#000000">IOException</span> {
        <span style="color:#aa5500">//given</span>
        <span style="color:#008855">String</span> <span style="color:#000000">data</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"{\"II\":\"2\"}"</span>;
        <span style="color:#aa5500">//when</span>
        <span style="color:#000000">ReflectionTestUtils</span>.<span style="color:#000000">setField</span>(<span style="color:#000000">httpUtil</span>, <span style="color:#aa1111">"url"</span>, <span style="color:#aa1111">"http://127.0.0.1:8080"</span>);
​
        <span style="color:#000000">PowerMockito</span>.<span style="color:#000000">when</span>(<span style="color:#000000">HttpClients</span>.<span style="color:#000000">custom</span>()).<span style="color:#000000">thenReturn</span>(<span style="color:#000000">httpClientBuilder</span>);
        <span style="color:#000000">PowerMockito</span>.<span style="color:#000000">when</span>(<span style="color:#000000">httpClientBuilder</span>.<span style="color:#000000">disableAutomaticRetries</span>()).<span style="color:#000000">thenReturn</span>(<span style="color:#000000">httpClientBuilder</span>);
        <span style="color:#000000">PowerMockito</span>.<span style="color:#000000">when</span>(<span style="color:#000000">httpClientBuilder</span>.<span style="color:#000000">build</span>()).<span style="color:#000000">thenReturn</span>(<span style="color:#000000">httpClient</span>);
​
        <span style="color:#000000">PowerMockito</span>.<span style="color:#000000">when</span>(<span style="color:#000000">httpClient</span>.<span style="color:#000000">execute</span>(<span style="color:#000000">any</span>(<span style="color:#000000">HttpPost</span>.<span style="color:#770088">class</span>))).<span style="color:#000000">thenReturn</span>(<span style="color:#000000">response</span>);
        <span style="color:#000000">PowerMockito</span>.<span style="color:#000000">when</span>(<span style="color:#000000">response</span>.<span style="color:#000000">getEntity</span>()).<span style="color:#000000">thenReturn</span>(<span style="color:#000000">entity</span>);
        <span style="color:#000000">PowerMockito</span>.<span style="color:#000000">when</span>(<span style="color:#000000">EntityUtils</span>.<span style="color:#000000">toString</span>(<span style="color:#000000">entity</span>,<span style="color:#aa1111">"UTF-8"</span>)).<span style="color:#000000">thenReturn</span>(<span style="color:#aa1111">"0rsgfe223323"</span>);
        <span style="color:#008855">String</span> <span style="color:#000000">s</span> <span style="color:#981a1a">=</span> <span style="color:#000000">httpUtil</span>.<span style="color:#000000">httpPost</span>(<span style="color:#000000">data</span>, <span style="color:#221199">null</span>);
        <span style="color:#aa5500">//then</span>
        <span style="color:#000000">Assert</span>.<span style="color:#000000">assertEquals</span>(<span style="color:#aa1111">"0rsgfe223323"</span>, <span style="color:#000000">s</span>);
    }</span></span>

PS:建议使用插件 TestMe 简单直接上手

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值