用powermock编写单元测试

2024-08-29 01:12

本文主要是介绍用powermock编写单元测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、pom文件引入jar包

<!-- 单元测试 start -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope>
</dependency>
<dependency><groupId>org.powermock</groupId><artifactId>powermock-module-junit4</artifactId><version>2.0.2</version><scope>test</scope>
</dependency>
<dependency><groupId>org.powermock</groupId><artifactId>powermock-api-mockito2</artifactId><version>2.0.2</version><scope>test</scope>
</dependency>
<dependency><groupId>com.github.jsonzou</groupId><artifactId>jmockdata</artifactId><version>4.1.2</version><scope>test</scope>
</dependency>
<!-- 单元测试 end -->

2、创建单元测试用例目录

保持与main级别一致,并且具体的测试用例存放目录也跟源代码的目录级别保持一致

8ce897237f8f56381fc80ddc386bd90a.png

cc2dabe8b7d178d93d043f4bb3cda1c9.png

3、单元测试类的基本框架

@RunWith(PowerMockRunner.class)
@PrepareForTest({CommonUtils.class}) // 工具类
public class OrderServiceTest {@InjectMocksprivate OrderService orderService;@Mockprivate OrderMapper orderMapper;@Mockprivate OrderHelper orderHelper;@Beforepublic void setUp() throws Exception {PowerMockito.mockStatic(CommonUtils.class);}// 被测试的方法 orderService.pageOrderRecord有返回值@Testpublic void testPageOrderRecord() {// GievnOrderRecordDTO orderRecordDTO = new OrderRecordDTO();orderRecordDTO.setId("111");orderRecordDTO.setPageIndex(1);orderRecordDTO.setPageSize(10);// WhenOrderRecordEntity orderRecord = JMockData.mock(OrderRecordEntity.class);List<OrderRecordEntity> mock = Lists.newArrayList();mock.add(orderRecord);PowerMockito.when(orderMapper.selectEntityListPage(any())).thenReturn(mock); // mock的方法有返回值PowerMockito.doNothing().when(orderHelper).fillData(any()); // mock的方法没有返回值PowerMockito.when(CommonUtils.doPageQuery(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(new PageRows<>()); // mock工具类方法// Run the testPageRows<OrderRecordDTO> rt = orderService.pageOrderRecord(OrderRecordDTO);// Verify the resultsAssert.assertNotNull(rt);}}

4、常见单元测试问题

4.1、静态方法如何mock

参见基本框架里的CommonUtils.doPageQuery()的mock。

如果被测试类的方法中调用到了静态方法CommonUtils.doPageQuery(),在写测试类的时候就需要主要注意:

@PrepareForTest({CommonUtils.class})、 

PowerMockito.mockStatic(CommonUtils.class);

4.2、返回类型为void的方法如何mock

参见基本框架里的orderHelper.fillData()方法的mock。

4.3、被@Value注解的值如何mock

    ReflectionTestUtils.setField(对象,"成员变量","变量mock值");

被测试类:

@Component
public class OrderExternalFacade {@Autowiredprivate OrderAbility OrderAbility;@Autowiredprivate OrderExternalConvertor OrderExternalConvertor;@Value("${switch.new.system:false}")protected boolean switchNewSystem;public PageRows<OrderVO> listOrder(OrderQueryVO OrderQueryVO) {if (switchNewSystem) {return OrderExternalConvertor.pageDto2PageVo(OrderAbility.listOrder(OrderExternalConvertor.queryVo2ModelQuery(OrderQueryVO)));}return OrderExternalConvertor.pageDto2PageVo(OrderAbility.listOrderFromEpm(OrderExternalConvertor.queryVo2QueryDto(OrderQueryVO)));}
}

单元测试类:

@RunWith(PowerMockRunner.class)
public class OrderExternalFacadeTest {@InjectMocksprivate OrderExternalFacade OrderExternalFacade;@Mockprivate OrderAbility OrderAbility;@Mockprivate OrderExternalConvertor OrderExternalConvertor;@Testpublic void listOrder() {ReflectionTestUtils.setField(OrderExternalFacade, "switchNewSystem", true);when(OrderExternalConvertor.queryVo2ModelQuery(any())).thenReturn(new OrderModelQueryDTO());when(OrderAbility.listOrder(any())).thenReturn(new PageRows<>());when(OrderExternalConvertor.pageDto2PageVo(any())).thenReturn(new PageRows<>());PageRows<OrderVO> rt = OrderExternalFacade.listOrder(new OrderQueryVO());Assert.assertNotNull(rt);}
}

4.4、返回类型为void的方法如何断言

验证调用次数:verify(OrderService, times(1)).insertOrder(orderBO);

被测试类:

public class OrderService{@Autowiredprivate OrderDao OrderDao;/*** 添加订单* @param OrderBO* @throws Exception*/@Overridepublic void insertOrder(OrderBO OrderBO) throws Exception{OrderDao.insertOrder(OrderBO);}
}

单元测试类:

@RunWith(PowerMockRunner.class)
public class OrderServiceTest {@InjectMocksprivate OrderService OrderService;@Mockprivate OrderDao OrderDao;@Beforepublic void setUp() throws Exception {}@Testpublic void testinsertOrder() throws Exception {OrderBO orderBO = new OrderBO();orderBO.setHandleType("order");orderBO.setBoId("1234568");orderBO.setHandeleSuggest("submit");// 如何mock 返回类型为void的方法PowerMockito.doNothing().when(OrderDao).insertOrder(any());//whenOrderService.insertOrder(orderBO);verify(OrderService, times(1)).insertOrder(orderBO);}}

4.5、异常如何断言

被测试类:

public void delete(List<String> ids, String requiredBillId) {RequiredBillEntity requiredBill = requiredBillMapper.selectEntity(requiredBillId);if (requiredBill == null){throw new BusinessException(RetCode.BUSINESSERROR_CODE, MessageConst.REQUIRED_BILL_NOT_FOUND);}if (!RequiredBillStatusEnum.DRAFT.getStatus().equals(requiredBill.getStatus())){throw new BusinessException(RetCode.BUSINESSERROR_CODE, MessageConst.REQUIRED_BILL_STATUS_NOT_DRAFT);}requiredBillDetailMapper.deleteEntities(new ParamsMap("id_IN", ids));
}

测试类:

@Test
public void testDelete() {List<String> ids = Lists.newArrayList();ids.add("dddd");String requiredBillId = "ddd";when(requiredBillMapper.selectEntity(anyString())).thenReturn(null);// 断言业务异常try {requiredBillDetailService.delete(ids,requiredBillId);fail("Expected BusiException");} catch (BusiException e) {assertEquals(RetCode.BUSINESSERROR_CODE, e.getExCode());assertEquals(REQUIRED_BILL_NOT_FOUND, e.getMessage());}}

简洁的一点的话:

@Test
public void testDelete() {List<String> ids = Lists.newArrayList();ids.add("dddd");String requiredBillId = "ddd";when(requiredBillMapper.selectEntity(anyString())).thenReturn(null);// 断言业务异常Assert.assertThrows(BusinessException.class, () ->requiredBillDetailService.delete(requiredBillDetailDTO));}

 

 

这篇关于用powermock编写单元测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116421

相关文章

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

使用PyQt5编写一个简单的取色器

《使用PyQt5编写一个简单的取色器》:本文主要介绍PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16进制颜色编码,一款跟随鼠标刷新图像的RGB和16... 目录取色器1取色器2PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16

使用Java编写一个文件批量重命名工具

《使用Java编写一个文件批量重命名工具》这篇文章主要为大家详细介绍了如何使用Java编写一个文件批量重命名工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景处理1. 文件夹检查与遍历2. 批量重命名3. 输出配置代码片段完整代码背景在开发移动应用时,UI设计通常会提供不

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

springboot+maven搭建的项目,集成单元测试

springboot+maven搭建的项目,集成单元测试 1.在pom.xml文件中引入单元测试的依赖包 <!--单元测试依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></depen

Wondows dos下怎么编写bat批处理文件

最近搞php,在运行时,以Nginx+php-cgi.exe方式运行Wordpress项目 打开dos,先cd到php-cgi.exe文件当前目录下执行启动命令:php-cgi.exe -b 127.0.0.1:9001再打开一个dos,再cd到nginx.exe文件当前目录下执行启动命令:start nginx 大概过程要经过这些步骤,觉得很麻烦,就学下怎么编写一个bat文件,以双击运行代替

用Python编写倒计时程序:详细教程

目录 引言 环境准备 基本概念 代码实现 步骤一:导入必要的库 步骤二:获取用户输入 步骤三:实现倒计时逻辑 步骤四:整合代码 运行程序 高级功能 扩展功能示例:支持分钟和小时输入 扩展功能示例:图形用户界面 (GUI) 总结 引言 倒计时程序是一个非常常见的小工具,广泛用于各种应用场景中,例如考试时间提醒、烹饪计时器、会议倒计时等。Python 作为一种

PowerMock 单元测试总结与常见坑解决方案

PowerMock 单元测试总结与常见坑解决方案 官方文档: PowerMock GitHub PowerMock 在单元测试中能够帮助我们解决静态类、final 方法、私有方法等无法轻易 mock 的问题。下面是我在实际使用 PowerMock 时踩过的一些坑,并结合 PowerMock 的一些方法进行总结。 基本依赖和设置 在 Maven 中添加 PowerMock 依赖。在测试

【Spring boot】编写代码及测试用例入门之 Hello Spring boot _踩坑记

先贴下目录: 这是我从 start.spring.io 里下载的依赖Web的模板 // DemoApplication.javapackage com.abloume.springboot.blog.demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autocon

windows下使用vscode编写运行以及调试C/C++

vscode支持类似于vs的断点调试c/c++,也可以直接编译&运行c/c++ 先是编译运行 c/c++的方法                              微软官方起初设定的科学做法(这也是现在的科学做法)是通过在vscode集成控制台写命令行的方式来实现编译运行程序的,但也可以通过code runner插件来简化步骤,实现一键编译执行 但无论是什么方法,因为vscod