IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 单元测试及示例说明 MockMockitoPocwerMockito示例 -> 正文阅读

[开发测试]单元测试及示例说明 MockMockitoPocwerMockito示例

标题单元测试及示例说明(Mock,Mockito,PocwerMockito)

单元测试总结文档

一 前置配置及说明

1. JUnit4Test Class模板配置

File–>Settings–>Editor–>File and Code Templates -->Code–>JUnit4Test Class

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.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import java.util.HashMap;
import java.util.Map;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doReturn;

#parse("File Header.java")
@RunWith(PowerMockRunner.class)
public class ${name}{

    @InjectMocks//创建一个需要测试的对象
    //function在具体测试方法中需要改成具体的className
    private ${CLASS_NAME} function;
    
    @Mock//模拟一个对象,注入到@InjectMocks的对象中
    private Manager manager;
     //Manager,需要改成测试类中对应的@Autowired 类 
   
    
    ${BODY}  
           
}

2. 测试类配置

File–>Settings–>Editor–>File and Code Templates -->code–>JUnit4 Test Class

/*IDEA 设置测试类方法体路径*/
File-->Settings-->Editor-->File and Code Templates -->code-->JUnit4 Test Class
import com.tesla.monitor.filter.FunchtionCounterInterceptor;
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.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
#parse("File Header.java")
@RunWith(PowerMockRunner.class)//启动
public class ${NAME}{
    @InjectMocks//创建一个测试对象
    private ${CLASS_NAME} function;
    
    @Mock//模拟一个对象,注入到@InjectMocks的对象中
    private Manager manager;
    
  ${BODY}
  
}

3. 测试类测试方法配置

File–>Settings–>Editor–>File and Code Templates -->code–>JUnit4 Test Method

/*IDEA 设置测试类方法路径*/
File-->Settings-->Editor-->File and Code Templates -->code-->JUnit4 Test Method
/**
*${NAME} 方法测试单元
*/
@org.junit.Test
public void ${NAME}BranchOne(){
/******************代理  非静态  Manager  出入参固定*************/
//代理调用返回
//doReturn(new Integer(100)).when(manger).getCurrentCount(anyString());

/****************************调用测试方法***********************/
//A reA = new A();
// Map<String ,Object> s = function.sysStatusProbe(reA);

/****************************验证***********************/
//Assert.assertEquals("running",s.get("sysStatus"));
${BODY}
}

4. SetUp Method配置

File–>Settings–>Editor–>File and Code Templates -->code–>JUnit4 SetUp Method

/*IDEA 设置setup路径*/
File-->Settings-->Editor-->File and Code Templates -->code-->JUnit4 SetUp Method
@org.junit.Before
public void setUp() throws Exception{
    //调用静态类时 加载该方法 做动态代理
    PowerMockito.mockitoStatic(ReturnMessageUtil.class);
    /********代理 returnMessage 方法*****/
    PowerMockito.when(ReturnMessageUtil.returnMessage(anyString(),angString()).thenReturn(new HashMap<String,Object>());
    ${BODY}
}

二 生成测试报告

//Edit Configurations 指令
//Command line
clean test -Dmaven.test.failure.ignore=true 
-f pom.xml 
  1. 报告地址(html)
    /target/site/jacoco/index.html

三 测试案例Demo

1. 情景一 Function.class

/**
*Function.class
*/
@Functions
public class AFunction{

@Autowired
private AManager amanager;

    /**
    *待测试方法
    */
    public Map<String , Object> aFunction(Object obj){
    //${BODY}
    }
    
}
/**
*FunctionTest.class
*/

@RunWith(PowerMockRunner.class)//启动
public class AFunctionTest{

@InjectMocks//创建一个被测试对象
private AFunction aFunction;

@Mock//注入InjectMocks对象里面
private AManager amanager;

    /**
    *AFunctionTest 方法测试单元
    */
    public void AFunctionTestBranchOne(){
    //${TESTBODY}
    /***********代理  非静态  Manager  出入参固定*************/
    //1.代理调用返回参数
    //doReturn(new Integer(100)).when(manger).getCurrentCount(anyString());
    
    /***********************调用测试方法***********************/
    //A reA = new A();
    // Map<String ,Object> s = function.aFunction(reA);
    
    /****************************验证***********************/
    //Assert.assertEquals("running",s.get("sysStatus"));

    }
    
}

2. 情景二 Function.class 内有使用static,final方法

/**
*FunctionTest.class
*/
@RunWith(PowerMockRunner.class)//启动
@PrepareForTest({Static.class})//静态类
public class AFunctionTest{

@InjectMocks//创建一个被测试对象
private AFunction aFunction;

@Mock//注入InjectMocks对象里面
private AManager amanager;

@test
public AFunction(){
    //${TESTBODY}
    
/******************代理  静态  static  出入参固定*************/
//1.代理调用静态
PowerMockito.mockStatic(static.class);
PowerMockito.when(Static.getProperties(anyObject())).thenReturn(someThing);

/**************************调用测试方法***********************/
A reA = new A();
Map<String ,Object> s = function.aFunction(reA);

/****************************验证***********************/
Assert.assertEquals("running",s.get("sysStatus"));
 
    }
    
}

3. 情景三 Enum.class

/**
*Enum.class
*/

public enun AaEnum{

    OPINION_YES("1","是"),
    OPINION_NO("0","否");
    
    AaEnum(String code,String value){
    this.code = code;
    this.value = value;
    
    }
    
    public String getCode(){
    return code;
    
    }

}
/**
*EnumTest.class
*/

@RunWith(PowerMockRunner.class)//启动注解
public enun AaEnumTest{

    /**
    *getCode 方法测试单元
    */    
    public void getCodeBranchOne(){
    
    /*************  调用测试方法   **********/
    String str = AaEnum.OPINION_YES.getCode();
    
    /*************   验证   ***********/
    Assert.assertNotNull(str);
    
    }

}

4. 情景四 测试类中私有属性需要赋值才能满足测试分支时

/**
*Function.class
*私有属性需要赋值的情况
*/

@Functions
public class AFunction{

@Autowired
private ApplicationContext applicationContext;

    /**
    *待测试方法
    */
    public Map<String , Object> aFunction(Object obj){
    //${BODY}
    }
    
}
/**
*FunctionTest.class
*/

@RunWith(PowerMockRunner.class)//启动
public class AFunctionTest{

@InjectMocks//创建一个被测试对象
private AFunction aFunction;

@Mock//注入InjectMocks对象里面
private AManager amanager;

    /**
    *AFunctionTest 方法测试单元
    */
    public void AFunctionTestBranchOne(){
    //${TESTBODY}
    /***********代理  非静态  Manager  出入参固定*************/
    //1.代理调用返回参数
    //doReturn(new Integer(100)).when(manger).getCurrentCount(anyString());
    
    //设置私有属性固定值,以满足我们所需的测试条件
    ApplicationContext applicationContext = PowerMockito.mock(ApplicationContext.class);
    MemberModifier.field(AFunction.class, "applicationContext").set(aFunction,applicationContext);
    
    /***********************调用测试方法***********************/
    //A reA = new A();
    // Map<String ,Object> s = function.aFunction(reA);
    
    /****************************验证***********************/
    //Assert.assertEquals("running",s.get("sysStatus"));

    }
    
}

5. 情景五 Abstract.class

抽象类的单元测试编写时,无需将被测试类@InjectMocks,直接将抽象类在测试类中设为私有属性即可

public abstract class AbstractFunctionTest{
private AbstractFunction abstractFunction;
} 

6. 情景六 修改logger属性

public class Person {
 private final Logger logger = LoggerFactory.getLogger(getClass())
     
     if(logger.isDebugEnabled()){
          logger.debug("********")
}

}
/**
*logger存在分支情况,若想让括号内为true,代理Logger
*/
@InjectMocks
private Person person;

   Logger logger = PowerMockito.mock(Logger.class);//代理logger
   when(logger.isDebugEnable()).thenReturn(true);//代理返回 
   MemberModifier.filed(Person.class,"logger")
   .set(person,logger)//修改成员属性  

7. 情景七 测试类中有静态方法

public class person{
/**
*待测试方法
*/
  public static String getName(){
          
  }
}
@RunWith(PowerMockRunner.class)//启动
public class personTest{
    @Test
    public void getName(){
    /***********************调用测试方法***********************/
     String s = Person.getName();
     /****************************验证***********************/
     Assert.assertNotNull(s);
    }
}

8. 情景八 常量类

/**
*被测试类
*/
public class ArcConstants{
    public static final String SYS_MODULE_CODE = "moduleCode";
     public static final String SYSTEM_INSTALL = "x22_INSTALL";
}
@RunWith(PowerMockRunner.class)//启动
public class ArcConstantsTest{
    @Test
    public void test(){
       ArcConstants arcConstants = new ArcConstants();

    }
}

四 不适宜做代理的情况

1. 被测试类内有new Class()的情况;

待测试类内部依赖new Class()返回值;
待测试类内部依赖

2. 被测试类内有继承父类的情况,父类方法无法代理;

3. 被测试类有依赖抽象类的情况下,无法代理;

mock抽象类时,没有走真正的方法,jacoco代码会覆盖不到,所以不建议mock

4. 待测试类中的方法无法做代理

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-12-11 16:01:27  更:2021-12-11 16:02:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 6:34:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码