1、pom文件引入jar包

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

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

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

@RunWith(PowerMockRunner.class)

@PrepareForTest({CommonUtils.class}) // 工具类

public class OrderServiceTest {


@InjectMocks

public class OrderServiceTest {


@Mock      

private OrderMapper orderMapper;


@Mock      

private OrderHelper orderHelper;


@Before

public void setUp() throws Exception {  

PowerMockito.mockStatic(CommonUtils.class);      

}


// 被测试的方法 orderService.pageOrderRecord有返回值  


@Test

public void testPageOrderRecord() {


// Gievn

OrderRecordDTO orderRecordDTO = new OrderRecordDTO();        

orderRecordDTO.setId("111");          

orderRecordDTO.setPageIndex(1);          

orderRecordDTO.setPageSize(10);


// When

OrderRecordEntity 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 test          


PageRows<OrderRecordDTO> rt = orderService.pageOrderRecord(OrderRecordDTO);


// Verify the results          

Assert.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值");

被测试类:

单元测试类:

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

验证调用次数: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 require

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

​​​软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

更多推荐