springboot mock unit test 对service进行mock单元测试 with junit4

package com.salesmanager.test.order;

import com.salesmanager.core.business.exception.ServiceException;
import com.salesmanager.core.business.repositories.order.OrderRepository;
import com.salesmanager.core.business.repositories.order.SaleRepository;
import com.salesmanager.core.business.services.order.MongoDBService;
import com.salesmanager.core.business.services.order.ScheduledTask;
import com.salesmanager.core.business.utils.DateUtils;
import com.salesmanager.core.model.common.CriteriaOrderBy;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.order.Order;
import com.salesmanager.core.model.order.OrderCriteria;
import com.salesmanager.core.model.order.OrderList;
import com.salesmanager.core.model.order.ProductDailySale;
import com.salesmanager.core.model.order.orderproduct.OrderProduct;
import com.salesmanager.core.model.order.orderstatus.OrderStatus;

import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import static org.mockito.Mockito.when;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class SalesTest {

    @InjectMocks
    ScheduledTask st;

    @Mock
    OrderRepository orderRepository;

    @Mock
    SaleRepository saleRepository;

    @Mock
    MongoDBService mongoDBService;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    // @Mock
    // private SaleRepository saleRepository;

    @Test
    public void ScheduledTask() throws ServiceException {
        System.out.println("====== SalesTest createOrderAndSales");

        // first page
        OrderList orderList = new OrderList();
        List<Order> orders = new ArrayList<>();
        populateOrders(orders);
        orderList.setOrders(orders);
        
        // last page
        OrderList emptyOrderList = new OrderList();
        orders = new ArrayList<>();
        emptyOrderList.setOrders(orders);

        // when the first call of orderRepository.listOrdersInAllStores,
        // we will return orderList
        // when the second call of orderRepository.listOrdersInAllStores,
        // we will return emptyOrderList
        // so the big while in orderRepository.listOrdersInAllStores will break.
        when(orderRepository.listOrdersInAllStores(any(OrderCriteria.class))).thenReturn(orderList)
                .thenReturn(emptyOrderList);

        // saleRepository.save() will save daily sale records to this list.
        List<ProductDailySale> salesList = new ArrayList<>();
        Answer answer = new Answer() {

            @Override
            public Object answer(InvocationOnMock invocation) throws Throwable {
                ProductDailySale pds = invocation.getArgument(0);
                salesList.add(pds);
                return null;
            }

        };
        when(saleRepository.save(any(ProductDailySale.class))).thenAnswer(answer);

        // call service layer method.
        st.executeDailySalesTask();
        
        // asserts
        
        /*
        for (ProductDailySale pds: salesList) {
            System.out.println(pds);
        }
        
        day[Mon Apr 05 15:51:17 CST 2021], merchantId[1] sku[SKU_2] quantity[2] charge[3000]
        day[Mon Apr 05 15:51:17 CST 2021], merchantId[1] sku[SKU_1] quantity[5] charge[5000]
        day[Mon Apr 05 15:51:17 CST 2021], merchantId[2] sku[SKU_22] quantity[2] charge[10000]
        */
        
        assertTrue(salesList.size() == 3);
        
        boolean hasSaleSku1 = false;
        boolean hasSaleSku2 = false;
        boolean hasSaleSku22 = false;
        
        for (int i = 0 ; i < salesList.size(); i++) {
            ProductDailySale pds = salesList.get(i);
            if (pds.getMerchant().getId() == 1
                    && pds.getSku().equals("SKU_1")
                    && pds.getQuantity() == 5
                    && pds.getCharge().equals(new BigDecimal(5000))) {
                
                hasSaleSku1 = true;
                
            }
            
            if (pds.getMerchant().getId() == 1
                    && pds.getSku().equals("SKU_2")
                    && pds.getQuantity() == 2
                    && pds.getCharge().equals(new BigDecimal(3000))) {
                
                hasSaleSku2 = true;
                
            }
            
            if (pds.getMerchant().getId() == 2
                    && pds.getSku().equals("SKU_22")
                    && pds.getQuantity() == 2
                    && pds.getCharge().equals(new BigDecimal(10000))) {
                
                hasSaleSku22 = true;
                
            }
        }
        
        assert(hasSaleSku1 == true);
        assert(hasSaleSku2 == true);
        assert(hasSaleSku22 == true);
        
    }

    private void populateOrders(List<Order> orders) {
        // CANCELED orders
        {
            Order order = new Order();
            
            order.setStatus(OrderStatus.CANCELED);
            
            MerchantStore merchant = new MerchantStore();
            merchant.setId(1);
            order.setMerchant(merchant);
            
            Set<OrderProduct> orderProducts = new HashSet<OrderProduct>();
            {
                OrderProduct orderProduct = new OrderProduct();
                
                orderProduct.setSku("SKU_1");
                orderProduct.setProductQuantity(1);
                BigDecimal oneTimeCharge = new BigDecimal(1000);
                orderProduct.setOneTimeCharge(oneTimeCharge);
                
                orderProducts.add(orderProduct);
            }
            order.setOrderProducts(orderProducts);
            
            orders.add(order);
        }
        
        // REFUNDED orders
        {
            Order order = new Order();
            
            order.setStatus(OrderStatus.REFUNDED);
            
            MerchantStore merchant = new MerchantStore();
            merchant.setId(1);
            order.setMerchant(merchant);
            
            Set<OrderProduct> orderProducts = new HashSet<OrderProduct>();
            {
                OrderProduct orderProduct = new OrderProduct();
                
                orderProduct.setSku("SKU_1");
                orderProduct.setProductQuantity(1);
                BigDecimal oneTimeCharge = new BigDecimal(1000);
                orderProduct.setOneTimeCharge(oneTimeCharge);
                
                orderProducts.add(orderProduct);
            }
            order.setOrderProducts(orderProducts);
            
            orders.add(order);
        }
        
        // normal orders
        {
            Order order = new Order();
            
            order.setStatus(OrderStatus.ORDERED);
            
            MerchantStore merchant = new MerchantStore();
            merchant.setId(1);
            order.setMerchant(merchant);
            
            Set<OrderProduct> orderProducts = new HashSet<OrderProduct>();
            {
                OrderProduct orderProduct = new OrderProduct();
                
                orderProduct.setSku("SKU_1");
                orderProduct.setProductQuantity(1);
                BigDecimal oneTimeCharge = new BigDecimal(1000);
                orderProduct.setOneTimeCharge(oneTimeCharge);
                
                orderProducts.add(orderProduct);
            }
            {
                OrderProduct orderProduct = new OrderProduct();
                
                orderProduct.setSku("SKU_2");
                orderProduct.setProductQuantity(2);
                BigDecimal oneTimeCharge = new BigDecimal(1500);
                orderProduct.setOneTimeCharge(oneTimeCharge);
                
                orderProducts.add(orderProduct);
            }

            order.setOrderProducts(orderProducts);
            
            orders.add(order);
        }
        {
            Order order = new Order();
            
            order.setStatus(OrderStatus.ORDERED);
            
            MerchantStore merchant = new MerchantStore();
            merchant.setId(1);
            order.setMerchant(merchant);
            
            Set<OrderProduct> orderProducts = new HashSet<OrderProduct>();
            {
                OrderProduct orderProduct = new OrderProduct();
                
                orderProduct.setSku("SKU_1");
                orderProduct.setProductQuantity(4);
                BigDecimal oneTimeCharge = new BigDecimal(1000);
                orderProduct.setOneTimeCharge(oneTimeCharge);
                
                orderProducts.add(orderProduct);
            }
            order.setOrderProducts(orderProducts);
            
            orders.add(order);
        }
        {
            Order order = new Order();
            
            order.setStatus(OrderStatus.ORDERED);
            
            MerchantStore merchant = new MerchantStore();
            merchant.setId(2);
            order.setMerchant(merchant);
            
            Set<OrderProduct> orderProducts = new HashSet<OrderProduct>();
            {
                OrderProduct orderProduct = new OrderProduct();
                
                orderProduct.setSku("SKU_22");
                orderProduct.setProductQuantity(2);
                BigDecimal oneTimeCharge = new BigDecimal(5000);
                orderProduct.setOneTimeCharge(oneTimeCharge);
                
                orderProducts.add(orderProduct);
            }
            order.setOrderProducts(orderProducts);
            
            orders.add(order);
        }
    }

}

 


版权声明:本文为wwwdyy8com原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。