trade:创建订单接口的后端实现的单元测试 50%

This commit is contained in:
YunaiV
2022-11-09 01:03:26 +08:00
parent 01d10b518c
commit bc2aa78f70
12 changed files with 247 additions and 233 deletions

View File

@@ -0,0 +1,145 @@
package cn.iocoder.yudao.module.trade.service.order;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
import cn.iocoder.yudao.module.member.api.address.AddressApi;
import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO;
import cn.iocoder.yudao.module.pay.api.order.PayOrderApi;
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.product.enums.spu.ProductSpuStatusEnum;
import cn.iocoder.yudao.module.promotion.api.price.PriceApi;
import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateRespDTO;
import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO;
import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper;
import cn.iocoder.yudao.module.trade.dal.mysql.orderitem.TradeOrderItemMapper;
import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderConfig;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Import;
import javax.annotation.Resource;
import java.util.Arrays;
import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;
/**
* {@link TradeOrderServiceImpl} 的单元测试类
*
* @author LeeYan9
* @since 2022-09-07
*/
@Import({TradeOrderServiceImpl.class, TradeOrderConfig.class})
class TradeOrderServiceTest extends BaseDbUnitTest {
@Resource
private TradeOrderServiceImpl tradeOrderService;
@Resource
private TradeOrderMapper tradeOrderMapper;
@Resource
private TradeOrderItemMapper tradeOrderItemMapper;
@MockBean
private ProductSpuApi productSpuApi;
@MockBean
private ProductSkuApi productSkuApi;
@MockBean
private PriceApi priceApi;
@MockBean
private PayOrderApi payOrderApi;
@MockBean
private AddressApi addressApi;
// 1, 3 个50 块;打折 20总和 = 6042;
// 2, 4 个20 块;打折 10总和 = 4028;
// 优惠劵,满 100 减 30
@Test
public void testCreateTradeOrder_success() {
// 准备参数
Long userId = 100L;
String clientIp = "127.0.0.1";
AppTradeOrderCreateReqVO reqVO = new AppTradeOrderCreateReqVO()
.setAddressId(10L).setCouponId(101L).setRemark("我是备注").setFromCart(true)
.setItems(Arrays.asList(new AppTradeOrderCreateReqVO.Item().setSkuId(1L).setCount(3),
new AppTradeOrderCreateReqVO.Item().setSkuId(2L).setCount(4)));
// mock 方法(商品 SKU 检查)
ProductSkuRespDTO sku01 = randomPojo(ProductSkuRespDTO.class, o -> o.setId(1L).setSpuId(11L)
.setPrice(50).setStock(100).setStatus(CommonStatusEnum.ENABLE.getStatus()));
ProductSkuRespDTO sku02 = randomPojo(ProductSkuRespDTO.class, o -> o.setId(2L).setSpuId(21L)
.setPrice(20).setStock(50).setStatus(CommonStatusEnum.ENABLE.getStatus()));
when(productSkuApi.getSkuList(eq(asSet(1L, 2L)))).thenReturn(Arrays.asList(sku01, sku02));
// mock 方法(商品 SPU 检查)
ProductSpuRespDTO spu01 = randomPojo(ProductSpuRespDTO.class, o -> o.setId(11L)
.setStatus(ProductSpuStatusEnum.ENABLE.getStatus()));
ProductSpuRespDTO spu02 = randomPojo(ProductSpuRespDTO.class, o -> o.setId(21L)
.setStatus(ProductSpuStatusEnum.ENABLE.getStatus()));
when(productSpuApi.getSpuList(eq(asSet(11L, 21L)))).thenReturn(Arrays.asList(spu01, spu02));
// mock 方法(用户收件地址的校验)
AddressRespDTO addressRespDTO = new AddressRespDTO().setId(10L).setUserId(userId).setName("芋艿")
.setMobile("15601691300").setAreaId(3306L).setPostCode("85757").setDetailAddress("土豆村");
when(addressApi.getAddress(eq(userId), eq(10L))).thenReturn(addressRespDTO);
// mock 方法(价格计算)
PriceCalculateRespDTO.OrderItem priceOrderItem01 = new PriceCalculateRespDTO.OrderItem()
.setSpuId(11L).setSkuId(1L).setCount(3).setOriginalPrice(150).setOriginalUnitPrice(50)
.setDiscountPrice(20).setPayPrice(130).setOrderPartPrice(7).setOrderDividePrice(35);
PriceCalculateRespDTO.OrderItem priceOrderItem02 = new PriceCalculateRespDTO.OrderItem()
.setSpuId(21L).setSkuId(2L).setCount(4).setOriginalPrice(80).setOriginalUnitPrice(20)
.setDiscountPrice(40).setPayPrice(40).setOrderPartPrice(15).setOrderDividePrice(25);
PriceCalculateRespDTO.Order priceOrder = new PriceCalculateRespDTO.Order()
.setOriginalPrice(230).setOrderPrice(100).setDiscountPrice(0).setCouponPrice(30)
.setPointPrice(10).setDeliveryPrice(20).setPayPrice(80).setCouponId(101L).setCouponPrice(30)
.setItems(Arrays.asList(priceOrderItem01, priceOrderItem02));
when(priceApi.calculatePrice(argThat(priceCalculateReqDTO -> {
assertEquals(priceCalculateReqDTO.getUserId(), 100L);
assertEquals(priceCalculateReqDTO.getCouponId(), 101L);
assertEquals(priceCalculateReqDTO.getItems().get(0).getSkuId(), 1L);
assertEquals(priceCalculateReqDTO.getItems().get(0).getCount(), 3);
assertEquals(priceCalculateReqDTO.getItems().get(1).getSkuId(), 2L);
assertEquals(priceCalculateReqDTO.getItems().get(1).getCount(), 4);
return true;
}))).thenReturn(new PriceCalculateRespDTO().setOrder(priceOrder));
// 调用方法
Long tradeOrderId = tradeOrderService.createTradeOrder(userId, clientIp, reqVO);
System.out.println(tradeOrderId);
// // mock 价格信息
// PriceCalculateRespDTO calculateRespDTO = randomPojo(PriceCalculateRespDTO.class, priceCalculateRespDTO -> {
// PriceCalculateRespDTO.OrderItem item = priceCalculateRespDTO.getOrder().getItems().get(0);
// item.setSkuId(1L);
// item.setCount(2);
// priceCalculateRespDTO.getOrder().setItems(Collections.singletonList(item));
// });
// when(priceApi.calculatePrice(any())).thenReturn(calculateRespDTO);
// //mock 支付订单信息
// when(payOrderApi.createPayOrder(any())).thenReturn(1L);
// // 创建交易订单,支付订单记录
// Long payOrderId = tradeOrderService.createTradeOrder(1L, "127.0.0.1", tradeOrderCreateReqVO);
// //断言交易订单
// TradeOrderDO tradeOrderDO = tradeOrderMapper.selectOne(TradeOrderDO::getUserId, 1L);
// assertNotNull(tradeOrderDO);
// //价格&用户
// assertEquals(calculateRespDTO.getOrder().getPayPrice(), tradeOrderDO.getPayPrice());
// assertEquals(1L, tradeOrderDO.getUserId());
// //断言交易订单项
// TradeOrderItemDO tradeOrderItemDO = tradeOrderItemMapper.selectOne(TradeOrderItemDO::getOrderId, tradeOrderDO.getId());
// assertNotNull(tradeOrderDO);
// //商品&用户
// assertEquals(skuInfoRespDTO.getId(), tradeOrderItemDO.getSkuId());
// assertEquals(1L, tradeOrderItemDO.getUserId());
// //价格
// assertEquals(calculateRespDTO.getOrder().getItems().get(0).getPresentPrice(), tradeOrderItemDO.getPresentPrice());
}
}

View File

@@ -0,0 +1,53 @@
spring:
main:
lazy-initialization: true # 开启懒加载,加快速度
banner-mode: off # 单元测试,禁用 Banner
--- #################### 数据库相关配置 ####################
spring:
# 数据源配置项
datasource:
name: ruoyi-vue-pro
url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式DATABASE_TO_UPPER 配置表和字段使用小写
driver-class-name: org.h2.Driver
username: sa
password:
druid:
async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度
initial-size: 1 # 单元测试,配置为 1提升启动速度
sql:
init:
schema-locations: classpath:/sql/create_tables.sql
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
redis:
host: 127.0.0.1 # 地址
port: 16379 # 端口(单元测试,使用 16379 端口)
database: 0 # 数据库索引
mybatis:
lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试
--- #################### 定时任务相关配置 ####################
--- #################### 配置中心相关配置 ####################
--- #################### 服务保障相关配置 ####################
# Lock4j 配置项(单元测试,禁用 Lock4j
# Resilience4j 配置项
--- #################### 监控相关配置 ####################
--- #################### 芋道相关配置 ####################
# 芋道配置项,设置当前项目所有自定义的配置
yudao:
info:
base-package: cn.iocoder.yudao.module
trade:
order:
app-id: 1
merchant-order-id: 1

View File

@@ -0,0 +1,4 @@
<configuration>
<!-- 引用 Spring Boot 的 logback 基础配置 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
</configuration>

View File

@@ -0,0 +1,2 @@
DELETE FROM trade_order;
DELETE FROM trade_order_item;

View File

@@ -0,0 +1,72 @@
CREATE TABLE IF NOT EXISTS "trade_order" (
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"no" varchar NOT NULL,
"type" int NOT NULL,
"terminal" int NOT NULL,
"user_id" bigint NOT NULL,
"user_ip" varchar NOT NULL,
"user_remark" varchar,
"status" int NOT NULL,
"product_count" int NOT NULL,
"cancel_type" int,
"remark" varchar,
"payed" bit NOT NULL,
"pay_time" datetime,
"finish_time" datetime,
"cancel_time" datetime,
"original_price" int NOT NULL,
"order_price" int NOT NULL,
"discount_price" int NOT NULL,
"delivery_price" int NOT NULL,
"adjust_price" int NOT NULL,
"pay_price" int NOT NULL,
"pay_order_id" int,
"pay_channel" int,
"delivery_templateid" int,
"express_no" int,
"delivery_status" bit NOT NULL,
"delivery_time" datetime,
"receive_time" datetime,
"receiver_name" varchar NOT NULL,
"receiver_mobile" varchar NOT NULL,
"receiver_area_id" int NOT NULL,
"receiver_post_code" int,
"receiver_detail_address" varchar NOT NULL,
"refund_status" int NOT NULL,
"refund_price" int NOT NULL,
"coupon_id" bigint NOT NULL,
"coupon_price" int NOT NULL,
"point_price" int NOT NULL,
"creator" varchar DEFAULT '',
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updater" varchar DEFAULT '',
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
"deleted" bit NOT NULL DEFAULT FALSE,
PRIMARY KEY ("id")
) COMMENT '交易订单表';
CREATE TABLE IF NOT EXISTS "trade_order_item" (
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"user_id" bigint NOT NULL,
"order_id" bigint NOT NULL,
"spu_id" bigint NOT NULL,
"sku_id" bigint NOT NULL,
"properties" varchar,
"name" varchar NOT NULL,
"pic_url" varchar,
"count" int NOT NULL,
"original_price" int NOT NULL,
"original_unit_price" int NOT NULL,
"discount_price" int NOT NULL,
"pay_price" int NOT NULL,
"order_part_price" int NOT NULL,
"order_divide_price" int NOT NULL,
"refund_status" int NOT NULL,
"refund_total" int NOT NULL,
"creator" varchar DEFAULT '',
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updater" varchar DEFAULT '',
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
"deleted" bit NOT NULL DEFAULT FALSE,
PRIMARY KEY ("id")
) COMMENT '交易订单明细表';