Powermock+junit4单元测试
1、引入jar包
<dependency><groupId>org.powermock</groupId><artifactId>powermock-api-mockito2</artifactId><version>${org.powermock.version}</version><scope>test</scope></dependency><dependency><groupId>org.powermock</groupId><artifactId>powermock-module-junit4</artifactId><version>${org.powermock.version}</version><scope>test</scope></dependency>
2、对于Mockito而言,有两种方式创建:
1. mock为一个interface提供一个虚拟的实现,
2. spy为object加一个动态代理,实现部分方法的虚拟化
3、 py 和 mock不同,不同点是:
- spy 的参数是对象示例,mock 的参数是 class。
- 被 spy 的对象,调用其方法时默认会走真实方法。mock 对象不会
4、mockito 会将 @Mock
、@Spy
修饰的对象自动注入到 @InjectMocks
修饰的对象中。
注入方式有多种,mockito 会按照下面的顺序尝试注入:
1. 构造函数注入
1. 设值函数注入(set函数)
1. 属性注入
@RunWith(PowerMockRunner.class)
public class StockAvailableDetailRecordTest {@InjectMocksprivate RabbitProducer rabbitProducer; // 待测试的实例对象@Mockprivate RabbitTemplate rabbitTemplate; // 需要Mock的对象@InjectMocksprivate TenantOmsImsServiceImpl tenantOmsImsServiceImpl;@Mockprivate IWarehouseService warehouseService;@Mockprivate IStockAvailableDetailService stockAvailableDetailService;//spy 和 mock不同,不同点是:// spy 的参数是对象示例,mock 的参数是 class。// 被 spy 的对象,调用其方法时默认会走真实方法。mock 对象不会。@Testpublic void testStockDetailRecord(){List<StockAvailableDetailRecord> records = new ArrayList<>();rabbitProducer.sendMqMessage(QueueDeclareEnum.STOCK_AVAILABLE_DETAIL_RECORD, records,"000000");}@Testpublic void testListAvailableStock(){OmsAvailableStockReqDTO omsAvailableStockReqDTO = preOmsAvailableStockReqDto();Warehouse warehouse = new Warehouse();warehouse.setId(227L);String warehouseCode = "USWEST1227";warehouse.setWarehouseCode(warehouseCode);Mockito.when(warehouseService.getWarehouseByCode(warehouseCode)).thenReturn(warehouse);GetAvailableByShopQuery query = new GetAvailableByShopQuery();query.setProductAuthId("000000");query.setProductOwnerId(0L);query.setWarehouseId(227L);query.setShopCode("amazon_US_05TK");query.setProductSku("QP80X928J9H");query.setOutputQty(1);Mockito.when(stockAvailableDetailService.addOverseaOwoAvailable(Mockito.any(), Mockito.any())).thenReturn(1);List<OwoAvailableDetailDto> availableDetails = new ArrayList<>();OwoAvailableDetailDto owoAvailableDetailDto = new OwoAvailableDetailDto();owoAvailableDetailDto.setStockId(20220106000001L);availableDetails.add(owoAvailableDetailDto);R<OmsAvailableStockReqDTO> res = tenantOmsImsServiceImpl.listAvailableStock(omsAvailableStockReqDTO);Assert.isTrue(res.isSuccess(), "fail");OmsAvailableStockReqDTO data = res.getData();}private OmsAvailableStockReqDTO preOmsAvailableStockReqDto(){OmsAvailableStockReqDTO omsAvailableStockReqDTO = new OmsAvailableStockReqDTO();ArrayList<OmsAvailableStockReqDTO.Detail> details = new ArrayList<>();omsAvailableStockReqDTO.setProductAuthId("000000");omsAvailableStockReqDTO.setDetails(details);OmsAvailableStockReqDTO.Detail detail = new OmsAvailableStockReqDTO.Detail();detail.setProductOwnerId(0L);detail.setWarehouseCode("USWEST1227");detail.setShopCode("amazon_US_05TK");detail.setProductSku("QP80X928J9H");detail.setProductQty(1);details.add(detail);return omsAvailableStockReqDTO;}}