Junit Mock 单元测试 实战总结
一、maven依赖
<!-- test -->
<junit.version>4.12</junit.version>
<jetty.version>8.1.10.v20130312</jetty.version>
<mockito.version>2.0.2-beta</mockito.version>
<hamcrest.version>1.3</hamcrest.version>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>${hamcrest.version}</version>
<scope>test</scope>
</dependency>
二、单元测试示例
package tf56.payOnlineService.facade.impl;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import tf56.architecture.framework.dto.Result;
import tf56.architecture.framework.request.BaseConstants;
import tf56.architecture.utils.dozer.DozerBeanMapperWrapper;
import tf56.payOnlineService.common.exception.AuditException;
import tf56.payOnlineService.common.exception.PaymentException;
import tf56.payOnlineService.jpa.entity.ReceiptApply;
import tf56.payOnlineService.jpa.repository.ProcessAuditRecordRepository;
import tf56.payOnlineService.mybatis.domain.PayonlineGuaranteePayNotifyFlow;
import tf56.payOnlineService.service.RocketMqProducer;
import tf56.payOnlineService.service.agentPay.AgentPayService;
import tf56.payOnlineService.service.guaranteeTrade.GuaranteeNotifyService;
import tf56.payOnlineService.service.oilCard.OilCardService;
import tf56.payOnlineService.service.payment.validate.PaymentApplyException;
import tf56.payOnlineService.service.receipt.ReceiptApplyService;
public class JunitMockTest {
@Autowired
@InjectMocks // @InjectMocks 只能 mock调用类,不能mock接口,可以进入
private GuaranteeNotifyService guaranteeNotifyMcokService;
@Mock // @Mock 可以mock 类和接口,但不进入
private ReceiptApplyService receiptApplyService;
@Mock
private RocketMqProducer rocketMqProducer;
@Mock
private ProcessAuditRecordRepository processAuditRecordRepository;
@Mock
private AgentPayService agentPayService;
@Mock
private OilCardService oilCardService;
@Mock
private DozerBeanMapperWrapper mapper;
@SuppressWarnings("unchecked")
@Test
public void testNotifyStatusChange_SuccessWhenItemIsRight(){
// void 方法
Mockito.doNothing().when(oilCardService).oilCardRegistResultNotify(Mockito.any());
// public void oilCardRegistResultNotify(List<PayonlineOilcardPaymentRegister> registerList){
Mockito.when(receiptApplyService.query(Mockito.any())).thenReturn(null, new ReceiptApply());
// public ReceiptApply query(String receiptApplyCode) {
String topic = null;
String tag = null;
Mockito.when(rocketMqProducer.sendMsg(Matchers.eq(topic), Matchers.eq(tag), Mockito.anyObject())).thenReturn("msgId1");
// public String sendMsg(String topic,String tag, byte[] msgBody) {
Mockito.when(mapper.mapper(Matchers.any(), Matchers.anyObject())).thenReturn(null);
// public <T> T mapper(Object source, Class<T> destinationClass){
List<Object> dozerRegisterList = new ArrayList<>();
Mockito.when(mapper.mapperList(Matchers.anyList(), Matchers.anyObject())).thenReturn(dozerRegisterList);
// public <T> List<T> mapperList(List<?> sources , Class<T> destinationClass){
Result<String> result1 = new Result<>();
result1.setResult(BaseConstants.SUCCESS);
Result<String> result2 = new Result<>();
result1.setResult(BaseConstants.ERROR);
Mockito.when(agentPayService.batchPay(Mockito.anyList(), Mockito.anyBoolean(), Mockito.any()))
.thenReturn(result1, result2).thenThrow(AuditException.class, PaymentException.class);
// public Result<String> batchPay(List<PaymentFunds> funds, boolean bankOrAccount, BatchPayRequestDTO dto){
Mockito.doThrow(PaymentApplyException.class).when(agentPayService).amountCheck(Mockito.any());
// public void amountCheck(BatchPayRequestDTO dto) {
// Mock JPA 的 save 方法
Mockito.when(processAuditRecordRepository.save(Mockito.anyList())).thenReturn(null);
// public interface ProcessAuditRecordRepository extends JpaRepository<ProcessAuditRecord, Long> {
// 或者
Mockito.when(processAuditRecordRepository.save(Mockito.anyList())).thenReturn(new ArrayList<>());
// =========================下面开始真正调用服务===================================
PayonlineGuaranteePayNotifyFlow flow = new PayonlineGuaranteePayNotifyFlow();
guaranteeNotifyMcokService.notifyStatusChange(flow);
}
@Before
public void before(){
MockitoAnnotations.initMocks(this);
}
}
版权声明:本文为li_tiantian原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。