package cn.iocoder.yudao.module.trade.service.price; import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO; import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi; import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO; import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi; import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; import cn.iocoder.yudao.module.trade.service.price.calculator.TradePriceCalculator; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import java.util.Arrays; import java.util.List; import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet; import static java.util.Collections.singletonList; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.when; /** * {@link TradePriceServiceImpl} 的单元测试 * * @author 芋道源码 */ public class TradePriceServiceImplTest extends BaseMockitoUnitTest { @InjectMocks private TradePriceServiceImpl tradePriceService; @Mock private ProductSkuApi productSkuApi; @Mock private ProductSpuApi productSpuApi; @Mock private List priceCalculators; @Test public void testCalculatePrice() { // 准备参数 TradePriceCalculateReqBO calculateReqBO = new TradePriceCalculateReqBO() .setUserId(10L) .setCouponId(20L).setAddressId(30L) .setItems(Arrays.asList( new TradePriceCalculateReqBO.Item().setSkuId(100L).setCount(1).setSelected(true), new TradePriceCalculateReqBO.Item().setSkuId(200L).setCount(3).setSelected(true), new TradePriceCalculateReqBO.Item().setSkuId(300L).setCount(6).setCartId(233L).setSelected(false) )); // mock 方法 List skuList = Arrays.asList( new ProductSkuRespDTO().setId(100L).setStock(500).setPrice(1000).setPicUrl("https://t.cn/1.png").setSpuId(1001L) .setProperties(singletonList(new ProductPropertyValueDetailRespDTO().setPropertyId(1L).setPropertyName("颜色") .setValueId(2L).setValueName("红色"))), new ProductSkuRespDTO().setId(200L).setStock(400).setPrice(2000).setPicUrl("https://t.cn/2.png").setSpuId(1001L) .setProperties(singletonList(new ProductPropertyValueDetailRespDTO().setPropertyId(1L).setPropertyName("颜色") .setValueId(3L).setValueName("黄色"))), new ProductSkuRespDTO().setId(300L).setStock(600).setPrice(3000).setPicUrl("https://t.cn/3.png").setSpuId(1001L) .setProperties(singletonList(new ProductPropertyValueDetailRespDTO().setPropertyId(1L).setPropertyName("颜色") .setValueId(4L).setValueName("黑色"))) ); when(productSkuApi.getSkuList(Mockito.eq(asSet(100L, 200L, 300L)))).thenReturn(skuList); when(productSpuApi.validateSpuList(Mockito.eq(asSet(1001L)))) .thenReturn(singletonList(new ProductSpuRespDTO().setId(1001L).setName("小菜").setCategoryId(666L))); // 调用 TradePriceCalculateRespBO calculateRespBO = tradePriceService.calculateOrderPrice(calculateReqBO); // 断言 assertEquals(TradeOrderTypeEnum.NORMAL.getType(), calculateRespBO.getType()); assertEquals(0, calculateRespBO.getPromotions().size()); assertNull(calculateRespBO.getCouponId()); // 断言:订单价格 assertEquals(7000, calculateRespBO.getPrice().getTotalPrice()); assertEquals(0, calculateRespBO.getPrice().getDiscountPrice()); assertEquals(0, calculateRespBO.getPrice().getDeliveryPrice()); assertEquals(0, calculateRespBO.getPrice().getCouponPrice()); assertEquals(0, calculateRespBO.getPrice().getPointPrice()); assertEquals(7000, calculateRespBO.getPrice().getPayPrice()); // 断言:SKU 1 assertEquals(1001L, calculateRespBO.getItems().get(0).getSpuId()); assertEquals(100L, calculateRespBO.getItems().get(0).getSkuId()); assertEquals(1, calculateRespBO.getItems().get(0).getCount()); assertNull(calculateRespBO.getItems().get(0).getCartId()); assertTrue(calculateRespBO.getItems().get(0).getSelected()); assertEquals(1000, calculateRespBO.getItems().get(0).getPrice()); assertEquals(0, calculateRespBO.getItems().get(0).getDiscountPrice()); assertEquals(0, calculateRespBO.getItems().get(0).getDeliveryPrice()); assertEquals(0, calculateRespBO.getItems().get(0).getCouponPrice()); assertEquals(0, calculateRespBO.getItems().get(0).getPointPrice()); assertEquals(1000, calculateRespBO.getItems().get(0).getPayPrice()); assertEquals("小菜", calculateRespBO.getItems().get(0).getSpuName()); assertEquals("https://t.cn/1.png", calculateRespBO.getItems().get(0).getPicUrl()); assertEquals(666L, calculateRespBO.getItems().get(0).getCategoryId()); assertEquals(skuList.get(0).getProperties(), calculateRespBO.getItems().get(0).getProperties()); // 断言:SKU 2 assertEquals(1001L, calculateRespBO.getItems().get(1).getSpuId()); assertEquals(200L, calculateRespBO.getItems().get(1).getSkuId()); assertEquals(3, calculateRespBO.getItems().get(1).getCount()); assertNull(calculateRespBO.getItems().get(1).getCartId()); assertTrue(calculateRespBO.getItems().get(1).getSelected()); assertEquals(2000, calculateRespBO.getItems().get(1).getPrice()); assertEquals(0, calculateRespBO.getItems().get(1).getDiscountPrice()); assertEquals(0, calculateRespBO.getItems().get(1).getDeliveryPrice()); assertEquals(0, calculateRespBO.getItems().get(1).getCouponPrice()); assertEquals(0, calculateRespBO.getItems().get(1).getPointPrice()); assertEquals(6000, calculateRespBO.getItems().get(1).getPayPrice()); assertEquals("小菜", calculateRespBO.getItems().get(1).getSpuName()); assertEquals("https://t.cn/2.png", calculateRespBO.getItems().get(1).getPicUrl()); assertEquals(666L, calculateRespBO.getItems().get(1).getCategoryId()); assertEquals(skuList.get(1).getProperties(), calculateRespBO.getItems().get(1).getProperties()); // 断言:SKU 3 assertEquals(1001L, calculateRespBO.getItems().get(2).getSpuId()); assertEquals(300L, calculateRespBO.getItems().get(2).getSkuId()); assertEquals(6, calculateRespBO.getItems().get(2).getCount()); assertEquals(233L, calculateRespBO.getItems().get(2).getCartId()); assertFalse(calculateRespBO.getItems().get(2).getSelected()); assertEquals(3000, calculateRespBO.getItems().get(2).getPrice()); assertEquals(0, calculateRespBO.getItems().get(2).getDiscountPrice()); assertEquals(0, calculateRespBO.getItems().get(2).getDeliveryPrice()); assertEquals(0, calculateRespBO.getItems().get(2).getCouponPrice()); assertEquals(0, calculateRespBO.getItems().get(2).getPointPrice()); assertEquals(18000, calculateRespBO.getItems().get(2).getPayPrice()); assertEquals("小菜", calculateRespBO.getItems().get(2).getSpuName()); assertEquals("https://t.cn/3.png", calculateRespBO.getItems().get(2).getPicUrl()); assertEquals(666L, calculateRespBO.getItems().get(2).getCategoryId()); assertEquals(skuList.get(2).getProperties(), calculateRespBO.getItems().get(2).getProperties()); } }