Junit Mock 单元测试 实战总结

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版权协议,转载请附上原文出处链接和本声明。