Commit 734236df97c99526f3a1d1c4cb3ce941bfe5f553
1 parent
bc2aa78f
trade:创建订单接口的后端实现的单元测试 100%
Showing
4 changed files
with
122 additions
and
36 deletions
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java
| ... | ... | @@ -116,7 +116,7 @@ public class TradeOrderDO extends BaseDO { |
| 116 | 116 | /** |
| 117 | 117 | * 商品原价(总),单位:分 |
| 118 | 118 | * |
| 119 | - * 基于 {@link TradeOrderItemDO#getTotalOriginalPrice()} 求和 | |
| 119 | + * 基于 {@link TradeOrderItemDO#getOriginalPrice()} 求和 | |
| 120 | 120 | * |
| 121 | 121 | * 对应 taobao 的 trade.total_fee 字段 |
| 122 | 122 | */ |
| ... | ... | @@ -207,7 +207,7 @@ public class TradeOrderDO extends BaseDO { |
| 207 | 207 | /** |
| 208 | 208 | * 收件人地区编号 |
| 209 | 209 | */ |
| 210 | - private Integer receiverAreaId; | |
| 210 | + private Long receiverAreaId; | |
| 211 | 211 | /** |
| 212 | 212 | * 收件人邮编 |
| 213 | 213 | */ | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java
| 1 | 1 | package cn.iocoder.yudao.module.trade.dal.dataobject.order; |
| 2 | 2 | |
| 3 | +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | |
| 3 | 4 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 4 | 5 | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemRefundStatusEnum; |
| 5 | 6 | import com.baomidou.mybatisplus.annotation.TableField; |
| 6 | 7 | import com.baomidou.mybatisplus.annotation.TableName; |
| 7 | -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; | |
| 8 | +import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; | |
| 8 | 9 | import lombok.Data; |
| 9 | 10 | import lombok.EqualsAndHashCode; |
| 10 | 11 | import lombok.experimental.Accessors; |
| ... | ... | @@ -16,7 +17,7 @@ import java.util.List; |
| 16 | 17 | * |
| 17 | 18 | * @author 芋道源码 |
| 18 | 19 | */ |
| 19 | -@TableName(value = "trade_order_item") | |
| 20 | +@TableName(value = "trade_order_item", autoResultMap = true) | |
| 20 | 21 | @Data |
| 21 | 22 | @Accessors(chain = true) |
| 22 | 23 | @EqualsAndHashCode(callSuper = true) |
| ... | ... | @@ -56,7 +57,7 @@ public class TradeOrderItemDO extends BaseDO { |
| 56 | 57 | /** |
| 57 | 58 | * 规格值数组,JSON 格式 |
| 58 | 59 | */ |
| 59 | - @TableField(typeHandler = JacksonTypeHandler.class) | |
| 60 | + @TableField(typeHandler = PropertyTypeHandler.class) | |
| 60 | 61 | private List<Property> properties; |
| 61 | 62 | /** |
| 62 | 63 | * 商品名称 |
| ... | ... | @@ -173,5 +174,20 @@ public class TradeOrderItemDO extends BaseDO { |
| 173 | 174 | |
| 174 | 175 | } |
| 175 | 176 | |
| 177 | + // TODO @芋艿:可以找一些新的思路 | |
| 178 | + public static class PropertyTypeHandler extends AbstractJsonTypeHandler<List<Property>> { | |
| 179 | + | |
| 180 | + @Override | |
| 181 | + protected List<Property> parse(String json) { | |
| 182 | + return JsonUtils.parseArray(json, Property.class); | |
| 183 | + } | |
| 184 | + | |
| 185 | + @Override | |
| 186 | + protected String toJson(List<Property> obj) { | |
| 187 | + return JsonUtils.toJsonString(obj); | |
| 188 | + } | |
| 189 | + | |
| 190 | + } | |
| 191 | + | |
| 176 | 192 | } |
| 177 | 193 | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceTest.java
| 1 | 1 | package cn.iocoder.yudao.module.trade.service.order; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| 4 | +import cn.iocoder.yudao.framework.common.enums.TerminalEnum; | |
| 4 | 5 | import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; |
| 5 | 6 | import cn.iocoder.yudao.module.member.api.address.AddressApi; |
| 6 | 7 | import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO; |
| ... | ... | @@ -13,8 +14,14 @@ import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum; |
| 13 | 14 | import cn.iocoder.yudao.module.promotion.api.price.PriceApi; |
| 14 | 15 | import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateRespDTO; |
| 15 | 16 | import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO; |
| 17 | +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; | |
| 18 | +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; | |
| 16 | 19 | import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper; |
| 17 | 20 | import cn.iocoder.yudao.module.trade.dal.mysql.orderitem.TradeOrderItemMapper; |
| 21 | +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemRefundStatusEnum; | |
| 22 | +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum; | |
| 23 | +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; | |
| 24 | +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; | |
| 18 | 25 | import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderConfig; |
| 19 | 26 | import org.junit.jupiter.api.Test; |
| 20 | 27 | import org.springframework.boot.test.mock.mockito.MockBean; |
| ... | ... | @@ -22,10 +29,12 @@ import org.springframework.context.annotation.Import; |
| 22 | 29 | |
| 23 | 30 | import javax.annotation.Resource; |
| 24 | 31 | import java.util.Arrays; |
| 32 | +import java.util.List; | |
| 25 | 33 | |
| 26 | 34 | import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet; |
| 27 | 35 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; |
| 28 | -import static org.junit.jupiter.api.Assertions.assertEquals; | |
| 36 | +import static java.util.Collections.singletonList; | |
| 37 | +import static org.junit.jupiter.api.Assertions.*; | |
| 29 | 38 | import static org.mockito.ArgumentMatchers.argThat; |
| 30 | 39 | import static org.mockito.ArgumentMatchers.eq; |
| 31 | 40 | import static org.mockito.Mockito.when; |
| ... | ... | @@ -66,16 +75,18 @@ class TradeOrderServiceTest extends BaseDbUnitTest { |
| 66 | 75 | public void testCreateTradeOrder_success() { |
| 67 | 76 | // 准备参数 |
| 68 | 77 | Long userId = 100L; |
| 69 | - String clientIp = "127.0.0.1"; | |
| 78 | + String userIp = "127.0.0.1"; | |
| 70 | 79 | AppTradeOrderCreateReqVO reqVO = new AppTradeOrderCreateReqVO() |
| 71 | 80 | .setAddressId(10L).setCouponId(101L).setRemark("我是备注").setFromCart(true) |
| 72 | 81 | .setItems(Arrays.asList(new AppTradeOrderCreateReqVO.Item().setSkuId(1L).setCount(3), |
| 73 | 82 | new AppTradeOrderCreateReqVO.Item().setSkuId(2L).setCount(4))); |
| 74 | 83 | // mock 方法(商品 SKU 检查) |
| 75 | 84 | ProductSkuRespDTO sku01 = randomPojo(ProductSkuRespDTO.class, o -> o.setId(1L).setSpuId(11L) |
| 76 | - .setPrice(50).setStock(100).setStatus(CommonStatusEnum.ENABLE.getStatus())); | |
| 85 | + .setPrice(50).setStock(100).setStatus(CommonStatusEnum.ENABLE.getStatus()) | |
| 86 | + .setProperties(singletonList(new ProductSkuRespDTO.Property().setPropertyId(111L).setValueId(222L)))); | |
| 77 | 87 | ProductSkuRespDTO sku02 = randomPojo(ProductSkuRespDTO.class, o -> o.setId(2L).setSpuId(21L) |
| 78 | - .setPrice(20).setStock(50).setStatus(CommonStatusEnum.ENABLE.getStatus())); | |
| 88 | + .setPrice(20).setStock(50).setStatus(CommonStatusEnum.ENABLE.getStatus())) | |
| 89 | + .setProperties(singletonList(new ProductSkuRespDTO.Property().setPropertyId(333L).setValueId(444L))); | |
| 79 | 90 | when(productSkuApi.getSkuList(eq(asSet(1L, 2L)))).thenReturn(Arrays.asList(sku01, sku02)); |
| 80 | 91 | // mock 方法(商品 SPU 检查) |
| 81 | 92 | ProductSpuRespDTO spu01 = randomPojo(ProductSpuRespDTO.class, o -> o.setId(11L) |
| ... | ... | @@ -109,35 +120,94 @@ class TradeOrderServiceTest extends BaseDbUnitTest { |
| 109 | 120 | }))).thenReturn(new PriceCalculateRespDTO().setOrder(priceOrder)); |
| 110 | 121 | |
| 111 | 122 | // 调用方法 |
| 112 | - Long tradeOrderId = tradeOrderService.createTradeOrder(userId, clientIp, reqVO); | |
| 113 | - System.out.println(tradeOrderId); | |
| 114 | - | |
| 115 | -// // mock 价格信息 | |
| 116 | -// PriceCalculateRespDTO calculateRespDTO = randomPojo(PriceCalculateRespDTO.class, priceCalculateRespDTO -> { | |
| 117 | -// PriceCalculateRespDTO.OrderItem item = priceCalculateRespDTO.getOrder().getItems().get(0); | |
| 118 | -// item.setSkuId(1L); | |
| 119 | -// item.setCount(2); | |
| 120 | -// priceCalculateRespDTO.getOrder().setItems(Collections.singletonList(item)); | |
| 121 | -// }); | |
| 122 | -// when(priceApi.calculatePrice(any())).thenReturn(calculateRespDTO); | |
| 123 | + Long tradeOrderId = tradeOrderService.createTradeOrder(userId, userIp, reqVO); | |
| 124 | + // 断言 TradeOrderDO 订单 | |
| 125 | + List<TradeOrderDO> tradeOrderDOs = tradeOrderMapper.selectList(); | |
| 126 | + assertEquals(tradeOrderDOs.size(), 1); | |
| 127 | + TradeOrderDO tradeOrderDO = tradeOrderDOs.get(0); | |
| 128 | + assertEquals(tradeOrderDO.getId(), tradeOrderId); | |
| 129 | + assertNotNull(tradeOrderDO.getNo()); | |
| 130 | + assertEquals(tradeOrderDO.getType(), TradeOrderTypeEnum.NORMAL.getType()); | |
| 131 | + assertEquals(tradeOrderDO.getTerminal(), TerminalEnum.H5.getTerminal()); | |
| 132 | + assertEquals(tradeOrderDO.getUserId(), userId); | |
| 133 | + assertEquals(tradeOrderDO.getUserIp(), userIp); | |
| 134 | + assertEquals(tradeOrderDO.getStatus(), TradeOrderStatusEnum.WAITING_PAYMENT.getStatus()); | |
| 135 | + assertEquals(tradeOrderDO.getProductCount(), 7); | |
| 136 | + assertNull(tradeOrderDO.getFinishTime()); | |
| 137 | + assertNull(tradeOrderDO.getCancelTime()); | |
| 138 | + assertNull(tradeOrderDO.getCancelType()); | |
| 139 | + assertEquals(tradeOrderDO.getUserRemark(), "我是备注"); | |
| 140 | + assertNull(tradeOrderDO.getRemark()); | |
| 141 | + assertFalse(tradeOrderDO.getPayed()); | |
| 142 | + assertNull(tradeOrderDO.getPayTime()); | |
| 143 | + assertEquals(tradeOrderDO.getOriginalPrice(), 230); | |
| 144 | + assertEquals(tradeOrderDO.getOrderPrice(), 100); | |
| 145 | + assertEquals(tradeOrderDO.getDiscountPrice(), 0); | |
| 146 | + assertEquals(tradeOrderDO.getAdjustPrice(), 0); | |
| 147 | + assertEquals(tradeOrderDO.getPayPrice(), 80); | |
| 148 | + assertNull(tradeOrderDO.getPayOrderId()); | |
| 149 | + assertNull(tradeOrderDO.getPayChannel()); | |
| 150 | + assertNull(tradeOrderDO.getDeliveryTemplateId()); | |
| 151 | + assertNull(tradeOrderDO.getExpressNo()); | |
| 152 | + assertFalse(tradeOrderDO.getDeliveryStatus()); | |
| 153 | + assertNull(tradeOrderDO.getDeliveryTime()); | |
| 154 | + assertNull(tradeOrderDO.getReceiveTime()); | |
| 155 | + assertEquals(tradeOrderDO.getReceiverName(), "芋艿"); | |
| 156 | + assertEquals(tradeOrderDO.getReceiverMobile(), "15601691300"); | |
| 157 | + assertEquals(tradeOrderDO.getReceiverAreaId(), 3306L); | |
| 158 | + assertEquals(tradeOrderDO.getReceiverPostCode(), 85757); | |
| 159 | + assertEquals(tradeOrderDO.getReceiverDetailAddress(), "土豆村"); | |
| 160 | + assertEquals(tradeOrderDO.getRefundStatus(), TradeOrderRefundStatusEnum.NONE.getStatus()); | |
| 161 | + assertEquals(tradeOrderDO.getRefundPrice(), 0); | |
| 162 | + assertEquals(tradeOrderDO.getCouponPrice(), 30); | |
| 163 | + assertEquals(tradeOrderDO.getPointPrice(), 10); | |
| 164 | + // 断言 TradeOrderItemDO 订单(第 1 个) | |
| 165 | + List<TradeOrderItemDO> tradeOrderItemDOs = tradeOrderItemMapper.selectList(); | |
| 166 | + assertEquals(tradeOrderItemDOs.size(), 2); | |
| 167 | + TradeOrderItemDO tradeOrderItemDO01 = tradeOrderItemDOs.get(0); | |
| 168 | + assertNotNull(tradeOrderItemDO01.getId()); | |
| 169 | + assertEquals(tradeOrderItemDO01.getUserId(), userId); | |
| 170 | + assertEquals(tradeOrderItemDO01.getOrderId(), tradeOrderId); | |
| 171 | + assertEquals(tradeOrderItemDO01.getSpuId(), 11L); | |
| 172 | + assertEquals(tradeOrderItemDO01.getSkuId(), 1L); | |
| 173 | + assertEquals(tradeOrderItemDO01.getProperties().size(), 1); | |
| 174 | + assertEquals(tradeOrderItemDO01.getProperties().get(0).getPropertyId(), 111L); | |
| 175 | + assertEquals(tradeOrderItemDO01.getProperties().get(0).getValueId(), 222L); | |
| 176 | + assertEquals(tradeOrderItemDO01.getName(), sku01.getName()); | |
| 177 | + assertEquals(tradeOrderItemDO01.getPicUrl(), sku01.getPicUrl()); | |
| 178 | + assertEquals(tradeOrderItemDO01.getCount(), 3); | |
| 179 | + assertEquals(tradeOrderItemDO01.getOriginalPrice(), 150); | |
| 180 | + assertEquals(tradeOrderItemDO01.getOriginalUnitPrice(), 50); | |
| 181 | + assertEquals(tradeOrderItemDO01.getDiscountPrice(), 20); | |
| 182 | + assertEquals(tradeOrderItemDO01.getPayPrice(), 130); | |
| 183 | + assertEquals(tradeOrderItemDO01.getOrderPartPrice(), 7); | |
| 184 | + assertEquals(tradeOrderItemDO01.getOrderDividePrice(), 35); | |
| 185 | + assertEquals(tradeOrderItemDO01.getRefundStatus(), TradeOrderItemRefundStatusEnum.NONE.getStatus()); | |
| 186 | + assertEquals(tradeOrderItemDO01.getRefundTotal(), 0); | |
| 187 | + // 断言 TradeOrderItemDO 订单(第 2 个) | |
| 188 | + TradeOrderItemDO tradeOrderItemDO02 = tradeOrderItemDOs.get(1); | |
| 189 | + assertNotNull(tradeOrderItemDO02.getId()); | |
| 190 | + assertEquals(tradeOrderItemDO02.getUserId(), userId); | |
| 191 | + assertEquals(tradeOrderItemDO02.getOrderId(), tradeOrderId); | |
| 192 | + assertEquals(tradeOrderItemDO02.getSpuId(), 21L); | |
| 193 | + assertEquals(tradeOrderItemDO02.getSkuId(), 2L); | |
| 194 | + assertEquals(tradeOrderItemDO02.getProperties().size(), 1); | |
| 195 | + assertEquals(tradeOrderItemDO02.getProperties().get(0).getPropertyId(), 333L); | |
| 196 | + assertEquals(tradeOrderItemDO02.getProperties().get(0).getValueId(), 444L); | |
| 197 | + assertEquals(tradeOrderItemDO02.getName(), sku02.getName()); | |
| 198 | + assertEquals(tradeOrderItemDO02.getPicUrl(), sku02.getPicUrl()); | |
| 199 | + assertEquals(tradeOrderItemDO02.getCount(), 4); | |
| 200 | + assertEquals(tradeOrderItemDO02.getOriginalPrice(), 80); | |
| 201 | + assertEquals(tradeOrderItemDO02.getOriginalUnitPrice(), 20); | |
| 202 | + assertEquals(tradeOrderItemDO02.getDiscountPrice(), 40); | |
| 203 | + assertEquals(tradeOrderItemDO02.getPayPrice(), 40); | |
| 204 | + assertEquals(tradeOrderItemDO02.getOrderPartPrice(), 15); | |
| 205 | + assertEquals(tradeOrderItemDO02.getOrderDividePrice(), 25); | |
| 206 | + assertEquals(tradeOrderItemDO02.getRefundStatus(), TradeOrderItemRefundStatusEnum.NONE.getStatus()); | |
| 207 | + assertEquals(tradeOrderItemDO02.getRefundTotal(), 0); | |
| 123 | 208 | // //mock 支付订单信息 |
| 124 | 209 | // when(payOrderApi.createPayOrder(any())).thenReturn(1L); |
| 125 | 210 | |
| 126 | - | |
| 127 | -// // 创建交易订单,支付订单记录 | |
| 128 | -// Long payOrderId = tradeOrderService.createTradeOrder(1L, "127.0.0.1", tradeOrderCreateReqVO); | |
| 129 | -// //断言交易订单 | |
| 130 | -// TradeOrderDO tradeOrderDO = tradeOrderMapper.selectOne(TradeOrderDO::getUserId, 1L); | |
| 131 | -// assertNotNull(tradeOrderDO); | |
| 132 | -// //价格&用户 | |
| 133 | -// assertEquals(calculateRespDTO.getOrder().getPayPrice(), tradeOrderDO.getPayPrice()); | |
| 134 | -// assertEquals(1L, tradeOrderDO.getUserId()); | |
| 135 | -// //断言交易订单项 | |
| 136 | -// TradeOrderItemDO tradeOrderItemDO = tradeOrderItemMapper.selectOne(TradeOrderItemDO::getOrderId, tradeOrderDO.getId()); | |
| 137 | -// assertNotNull(tradeOrderDO); | |
| 138 | -// //商品&用户 | |
| 139 | -// assertEquals(skuInfoRespDTO.getId(), tradeOrderItemDO.getSkuId()); | |
| 140 | -// assertEquals(1L, tradeOrderItemDO.getUserId()); | |
| 141 | 211 | // //价格 |
| 142 | 212 | // assertEquals(calculateRespDTO.getOrder().getItems().get(0).getPresentPrice(), tradeOrderItemDO.getPresentPrice()); |
| 143 | 213 | } | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/test/resources/sql/create_tables.sql
| ... | ... | @@ -22,7 +22,7 @@ CREATE TABLE IF NOT EXISTS "trade_order" ( |
| 22 | 22 | "pay_price" int NOT NULL, |
| 23 | 23 | "pay_order_id" int, |
| 24 | 24 | "pay_channel" int, |
| 25 | - "delivery_templateid" int, | |
| 25 | + "delivery_template_id" int, | |
| 26 | 26 | "express_no" int, |
| 27 | 27 | "delivery_status" bit NOT NULL, |
| 28 | 28 | "delivery_time" datetime, | ... | ... |