1、保存订单商品,2、验证参数是否合法
This commit is contained in:
170
src/test/java/com/gxwebsoft/shop/OrderBusinessServiceTest.java
Normal file
170
src/test/java/com/gxwebsoft/shop/OrderBusinessServiceTest.java
Normal file
@@ -0,0 +1,170 @@
|
||||
package com.gxwebsoft.shop;
|
||||
|
||||
import com.gxwebsoft.common.system.entity.User;
|
||||
import com.gxwebsoft.shop.dto.OrderCreateRequest;
|
||||
import com.gxwebsoft.shop.entity.ShopGoods;
|
||||
import com.gxwebsoft.shop.entity.ShopOrder;
|
||||
import com.gxwebsoft.shop.entity.ShopOrderGoods;
|
||||
import com.gxwebsoft.shop.service.OrderBusinessService;
|
||||
import com.gxwebsoft.shop.service.ShopGoodsService;
|
||||
import com.gxwebsoft.shop.service.ShopOrderGoodsService;
|
||||
import com.gxwebsoft.shop.service.ShopOrderService;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.mockito.InjectMocks;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
/**
|
||||
* 订单业务服务测试类
|
||||
*
|
||||
* @author 科技小王子
|
||||
* @since 2025-01-26
|
||||
*/
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
public class OrderBusinessServiceTest {
|
||||
|
||||
@Mock
|
||||
private ShopOrderService shopOrderService;
|
||||
|
||||
@Mock
|
||||
private ShopOrderGoodsService shopOrderGoodsService;
|
||||
|
||||
@Mock
|
||||
private ShopGoodsService shopGoodsService;
|
||||
|
||||
@InjectMocks
|
||||
private OrderBusinessService orderBusinessService;
|
||||
|
||||
private User testUser;
|
||||
private OrderCreateRequest testRequest;
|
||||
private ShopGoods testGoods;
|
||||
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
// 准备测试用户
|
||||
testUser = new User();
|
||||
testUser.setUserId(1);
|
||||
testUser.setOpenid("test_openid");
|
||||
testUser.setPhone("13800138000");
|
||||
|
||||
// 准备测试商品
|
||||
testGoods = new ShopGoods();
|
||||
testGoods.setGoodsId(10018);
|
||||
testGoods.setName("科技小王子大米年卡套餐2.5kg");
|
||||
testGoods.setPrice(new BigDecimal("99.00"));
|
||||
testGoods.setImage("test_image.jpg");
|
||||
|
||||
// 准备测试订单请求
|
||||
testRequest = new OrderCreateRequest();
|
||||
testRequest.setType(0);
|
||||
testRequest.setTotalPrice(new BigDecimal("99.00"));
|
||||
testRequest.setPayPrice(new BigDecimal("99.00"));
|
||||
testRequest.setTotalNum(1);
|
||||
testRequest.setPayType(1);
|
||||
testRequest.setTenantId(1);
|
||||
testRequest.setAddressId(10832);
|
||||
testRequest.setComments("科技小王子大米年卡套餐2.5kg");
|
||||
testRequest.setDeliveryType(0);
|
||||
|
||||
// 准备商品项列表
|
||||
OrderCreateRequest.OrderGoodsItem goodsItem = new OrderCreateRequest.OrderGoodsItem();
|
||||
goodsItem.setGoodsId(10018);
|
||||
goodsItem.setQuantity(1);
|
||||
goodsItem.setPayType(1);
|
||||
|
||||
testRequest.setGoodsItems(Arrays.asList(goodsItem));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testCreateOrderWithGoods() {
|
||||
// Mock 商品查询
|
||||
when(shopGoodsService.getById(10018)).thenReturn(testGoods);
|
||||
|
||||
// Mock 订单保存
|
||||
when(shopOrderService.save(any(ShopOrder.class))).thenAnswer(invocation -> {
|
||||
ShopOrder order = invocation.getArgument(0);
|
||||
order.setOrderId(1); // 模拟数据库生成的ID
|
||||
return true;
|
||||
});
|
||||
|
||||
// Mock 订单商品批量保存
|
||||
when(shopOrderGoodsService.saveBatch(anyList())).thenReturn(true);
|
||||
|
||||
// Mock 微信支付订单创建
|
||||
HashMap<String, String> wxOrderInfo = new HashMap<>();
|
||||
wxOrderInfo.put("prepay_id", "test_prepay_id");
|
||||
when(shopOrderService.createWxOrder(any(ShopOrder.class))).thenReturn(wxOrderInfo);
|
||||
|
||||
// 执行测试
|
||||
Map<String, String> result = orderBusinessService.createOrder(testRequest, testUser);
|
||||
|
||||
// 验证结果
|
||||
assert result != null;
|
||||
assert result.containsKey("prepay_id");
|
||||
|
||||
// 验证方法调用
|
||||
verify(shopGoodsService, times(1)).getById(10018);
|
||||
verify(shopOrderService, times(1)).save(any(ShopOrder.class));
|
||||
verify(shopOrderGoodsService, times(1)).saveBatch(anyList());
|
||||
verify(shopOrderService, times(1)).createWxOrder(any(ShopOrder.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testCreateOrderWithMultipleGoods() {
|
||||
// 准备多个商品项
|
||||
OrderCreateRequest.OrderGoodsItem goodsItem1 = new OrderCreateRequest.OrderGoodsItem();
|
||||
goodsItem1.setGoodsId(10018);
|
||||
goodsItem1.setQuantity(1);
|
||||
goodsItem1.setPayType(1);
|
||||
|
||||
OrderCreateRequest.OrderGoodsItem goodsItem2 = new OrderCreateRequest.OrderGoodsItem();
|
||||
goodsItem2.setGoodsId(10019);
|
||||
goodsItem2.setQuantity(2);
|
||||
goodsItem2.setPayType(1);
|
||||
|
||||
testRequest.setGoodsItems(Arrays.asList(goodsItem1, goodsItem2));
|
||||
testRequest.setTotalPrice(new BigDecimal("297.00")); // 99 + 99*2
|
||||
|
||||
// Mock 商品查询
|
||||
when(shopGoodsService.getById(10018)).thenReturn(testGoods);
|
||||
|
||||
ShopGoods testGoods2 = new ShopGoods();
|
||||
testGoods2.setGoodsId(10019);
|
||||
testGoods2.setName("测试商品2");
|
||||
testGoods2.setPrice(new BigDecimal("99.00"));
|
||||
testGoods2.setImage("test_image2.jpg");
|
||||
when(shopGoodsService.getById(10019)).thenReturn(testGoods2);
|
||||
|
||||
// Mock 其他服务
|
||||
when(shopOrderService.save(any(ShopOrder.class))).thenAnswer(invocation -> {
|
||||
ShopOrder order = invocation.getArgument(0);
|
||||
order.setOrderId(1);
|
||||
return true;
|
||||
});
|
||||
when(shopOrderGoodsService.saveBatch(anyList())).thenReturn(true);
|
||||
when(shopOrderService.createWxOrder(any(ShopOrder.class))).thenReturn(new HashMap<>());
|
||||
|
||||
// 执行测试
|
||||
orderBusinessService.createOrder(testRequest, testUser);
|
||||
|
||||
// 验证商品查询次数
|
||||
verify(shopGoodsService, times(1)).getById(10018);
|
||||
verify(shopGoodsService, times(1)).getById(10019);
|
||||
|
||||
// 验证保存的商品项数量
|
||||
verify(shopOrderGoodsService, times(1)).saveBatch(argThat(list ->
|
||||
((List<ShopOrderGoods>) list).size() == 2
|
||||
));
|
||||
}
|
||||
}
|
||||
243
src/test/java/com/gxwebsoft/shop/OrderValidationTest.java
Normal file
243
src/test/java/com/gxwebsoft/shop/OrderValidationTest.java
Normal file
@@ -0,0 +1,243 @@
|
||||
package com.gxwebsoft.shop;
|
||||
|
||||
import com.gxwebsoft.common.core.exception.BusinessException;
|
||||
import com.gxwebsoft.common.system.entity.User;
|
||||
import com.gxwebsoft.shop.config.OrderConfigProperties;
|
||||
import com.gxwebsoft.shop.dto.OrderCreateRequest;
|
||||
import com.gxwebsoft.shop.entity.ShopGoods;
|
||||
import com.gxwebsoft.shop.service.OrderBusinessService;
|
||||
import com.gxwebsoft.shop.service.ShopGoodsService;
|
||||
import com.gxwebsoft.shop.service.ShopOrderGoodsService;
|
||||
import com.gxwebsoft.shop.service.ShopOrderService;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.mockito.InjectMocks;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Arrays;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
/**
|
||||
* 订单验证测试类
|
||||
* 测试商品信息后台验证逻辑
|
||||
*/
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
class OrderValidationTest {
|
||||
|
||||
@Mock
|
||||
private ShopOrderService shopOrderService;
|
||||
|
||||
@Mock
|
||||
private ShopOrderGoodsService shopOrderGoodsService;
|
||||
|
||||
@Mock
|
||||
private ShopGoodsService shopGoodsService;
|
||||
|
||||
@Mock
|
||||
private OrderConfigProperties orderConfig;
|
||||
|
||||
@InjectMocks
|
||||
private OrderBusinessService orderBusinessService;
|
||||
|
||||
private User testUser;
|
||||
private OrderCreateRequest testRequest;
|
||||
private ShopGoods testGoods;
|
||||
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
// 准备测试用户
|
||||
testUser = new User();
|
||||
testUser.setUserId(1);
|
||||
testUser.setNickname("测试用户");
|
||||
testUser.setPhone("13800138000");
|
||||
|
||||
// 准备测试商品
|
||||
testGoods = new ShopGoods();
|
||||
testGoods.setGoodsId(10018);
|
||||
testGoods.setName("测试商品");
|
||||
testGoods.setPrice(new BigDecimal("99.00"));
|
||||
testGoods.setStatus(0); // 上架状态
|
||||
testGoods.setStock(100); // 库存100
|
||||
testGoods.setCanBuyNumber(10); // 最大购买数量10
|
||||
testGoods.setCode("TEST001");
|
||||
|
||||
// 准备测试订单请求
|
||||
testRequest = new OrderCreateRequest();
|
||||
testRequest.setType(0);
|
||||
testRequest.setTitle("测试订单");
|
||||
testRequest.setTotalPrice(new BigDecimal("99.00"));
|
||||
testRequest.setTenantId(1);
|
||||
|
||||
// 准备商品项
|
||||
OrderCreateRequest.OrderGoodsItem goodsItem = new OrderCreateRequest.OrderGoodsItem();
|
||||
goodsItem.setGoodsId(10018);
|
||||
goodsItem.setQuantity(1);
|
||||
testRequest.setGoodsItems(Arrays.asList(goodsItem));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testValidateOrderRequest_Success() {
|
||||
// Mock 商品查询
|
||||
when(shopGoodsService.getById(10018)).thenReturn(testGoods);
|
||||
when(orderConfig.getTenantRule(1)).thenReturn(null);
|
||||
|
||||
// 执行验证 - 应该成功
|
||||
assertDoesNotThrow(() -> {
|
||||
// 使用反射调用私有方法进行测试
|
||||
java.lang.reflect.Method method = OrderBusinessService.class
|
||||
.getDeclaredMethod("validateOrderRequest", OrderCreateRequest.class, User.class);
|
||||
method.setAccessible(true);
|
||||
method.invoke(orderBusinessService, testRequest, testUser);
|
||||
});
|
||||
|
||||
// 验证总金额被正确设置
|
||||
assertEquals(new BigDecimal("99.00"), testRequest.getTotalPrice());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testValidateOrderRequest_GoodsNotFound() {
|
||||
// Mock 商品不存在
|
||||
when(shopGoodsService.getById(10018)).thenReturn(null);
|
||||
|
||||
// 执行验证 - 应该抛出异常
|
||||
Exception exception = assertThrows(Exception.class, () -> {
|
||||
java.lang.reflect.Method method = OrderBusinessService.class
|
||||
.getDeclaredMethod("validateOrderRequest", OrderCreateRequest.class, User.class);
|
||||
method.setAccessible(true);
|
||||
method.invoke(orderBusinessService, testRequest, testUser);
|
||||
});
|
||||
|
||||
// 检查是否是 InvocationTargetException 包装的 BusinessException
|
||||
assertTrue(exception instanceof java.lang.reflect.InvocationTargetException);
|
||||
Throwable cause = exception.getCause();
|
||||
assertTrue(cause instanceof BusinessException);
|
||||
assertTrue(cause.getMessage().contains("商品不存在"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testValidateOrderRequest_GoodsOffShelf() {
|
||||
// 设置商品为下架状态
|
||||
testGoods.setStatus(1);
|
||||
when(shopGoodsService.getById(10018)).thenReturn(testGoods);
|
||||
|
||||
// 执行验证 - 应该抛出异常
|
||||
Exception exception = assertThrows(Exception.class, () -> {
|
||||
java.lang.reflect.Method method = OrderBusinessService.class
|
||||
.getDeclaredMethod("validateOrderRequest", OrderCreateRequest.class, User.class);
|
||||
method.setAccessible(true);
|
||||
method.invoke(orderBusinessService, testRequest, testUser);
|
||||
});
|
||||
|
||||
// 检查是否是 InvocationTargetException 包装的 BusinessException
|
||||
assertTrue(exception instanceof java.lang.reflect.InvocationTargetException);
|
||||
Throwable cause = exception.getCause();
|
||||
assertTrue(cause instanceof BusinessException);
|
||||
assertTrue(cause.getMessage().contains("商品已下架"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testValidateOrderRequest_InsufficientStock() {
|
||||
// 设置库存不足
|
||||
testGoods.setStock(0);
|
||||
when(shopGoodsService.getById(10018)).thenReturn(testGoods);
|
||||
|
||||
// 执行验证 - 应该抛出异常
|
||||
Exception exception = assertThrows(Exception.class, () -> {
|
||||
java.lang.reflect.Method method = OrderBusinessService.class
|
||||
.getDeclaredMethod("validateOrderRequest", OrderCreateRequest.class, User.class);
|
||||
method.setAccessible(true);
|
||||
method.invoke(orderBusinessService, testRequest, testUser);
|
||||
});
|
||||
|
||||
// 检查是否是 InvocationTargetException 包装的 BusinessException
|
||||
assertTrue(exception instanceof java.lang.reflect.InvocationTargetException);
|
||||
Throwable cause = exception.getCause();
|
||||
assertTrue(cause instanceof BusinessException);
|
||||
assertTrue(cause.getMessage().contains("商品库存不足"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testValidateOrderRequest_ExceedBuyLimit() {
|
||||
// 设置购买数量超过限制
|
||||
testRequest.getGoodsItems().get(0).setQuantity(15); // 超过最大购买数量10
|
||||
when(shopGoodsService.getById(10018)).thenReturn(testGoods);
|
||||
|
||||
// 执行验证 - 应该抛出异常
|
||||
Exception exception = assertThrows(Exception.class, () -> {
|
||||
java.lang.reflect.Method method = OrderBusinessService.class
|
||||
.getDeclaredMethod("validateOrderRequest", OrderCreateRequest.class, User.class);
|
||||
method.setAccessible(true);
|
||||
method.invoke(orderBusinessService, testRequest, testUser);
|
||||
});
|
||||
|
||||
// 检查是否是 InvocationTargetException 包装的 BusinessException
|
||||
assertTrue(exception instanceof java.lang.reflect.InvocationTargetException);
|
||||
Throwable cause = exception.getCause();
|
||||
assertTrue(cause instanceof BusinessException);
|
||||
assertTrue(cause.getMessage().contains("购买数量超过限制"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testValidateOrderRequest_PriceCalculation() {
|
||||
// 设置多个商品项
|
||||
OrderCreateRequest.OrderGoodsItem goodsItem1 = new OrderCreateRequest.OrderGoodsItem();
|
||||
goodsItem1.setGoodsId(10018);
|
||||
goodsItem1.setQuantity(2);
|
||||
|
||||
OrderCreateRequest.OrderGoodsItem goodsItem2 = new OrderCreateRequest.OrderGoodsItem();
|
||||
goodsItem2.setGoodsId(10019);
|
||||
goodsItem2.setQuantity(1);
|
||||
|
||||
testRequest.setGoodsItems(Arrays.asList(goodsItem1, goodsItem2));
|
||||
testRequest.setTotalPrice(new BigDecimal("297.00")); // 99*2 + 99*1
|
||||
|
||||
// 准备第二个商品
|
||||
ShopGoods testGoods2 = new ShopGoods();
|
||||
testGoods2.setGoodsId(10019);
|
||||
testGoods2.setName("测试商品2");
|
||||
testGoods2.setPrice(new BigDecimal("99.00"));
|
||||
testGoods2.setStatus(0);
|
||||
testGoods2.setStock(100);
|
||||
|
||||
when(shopGoodsService.getById(10018)).thenReturn(testGoods);
|
||||
when(shopGoodsService.getById(10019)).thenReturn(testGoods2);
|
||||
when(orderConfig.getTenantRule(1)).thenReturn(null);
|
||||
|
||||
// 执行验证 - 应该成功
|
||||
assertDoesNotThrow(() -> {
|
||||
java.lang.reflect.Method method = OrderBusinessService.class
|
||||
.getDeclaredMethod("validateOrderRequest", OrderCreateRequest.class, User.class);
|
||||
method.setAccessible(true);
|
||||
method.invoke(orderBusinessService, testRequest, testUser);
|
||||
});
|
||||
|
||||
// 验证总金额计算正确
|
||||
assertEquals(new BigDecimal("297.00"), testRequest.getTotalPrice());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testValidateOrderRequest_PriceDiscrepancy() {
|
||||
// 设置前端传入的金额与后台计算不一致
|
||||
testRequest.setTotalPrice(new BigDecimal("88.00")); // 错误的金额
|
||||
when(shopGoodsService.getById(10018)).thenReturn(testGoods);
|
||||
|
||||
// 执行验证 - 应该抛出异常
|
||||
Exception exception = assertThrows(Exception.class, () -> {
|
||||
java.lang.reflect.Method method = OrderBusinessService.class
|
||||
.getDeclaredMethod("validateOrderRequest", OrderCreateRequest.class, User.class);
|
||||
method.setAccessible(true);
|
||||
method.invoke(orderBusinessService, testRequest, testUser);
|
||||
});
|
||||
|
||||
// 检查是否是 InvocationTargetException 包装的 BusinessException
|
||||
assertTrue(exception instanceof java.lang.reflect.InvocationTargetException);
|
||||
Throwable cause = exception.getCause();
|
||||
assertTrue(cause instanceof BusinessException);
|
||||
assertTrue(cause.getMessage().contains("订单金额计算错误"));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user