|
@@ -13,6 +13,7 @@ import org.springframework.test.util.ReflectionTestUtils;
|
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
|
|
|
+import static org.mockito.ArgumentMatchers.anyInt;
|
|
|
import static org.mockito.ArgumentMatchers.eq;
|
|
import static org.mockito.ArgumentMatchers.eq;
|
|
|
import static org.mockito.Mockito.mock;
|
|
import static org.mockito.Mockito.mock;
|
|
|
import static org.mockito.Mockito.never;
|
|
import static org.mockito.Mockito.never;
|
|
@@ -68,7 +69,7 @@ public class ProductOrderServiceFulfillmentMultiModeTest {
|
|
|
User buyer = new User();
|
|
User buyer = new User();
|
|
|
buyer.setOpenid("oABC123");
|
|
buyer.setOpenid("oABC123");
|
|
|
when(userMapper.selectById(100L)).thenReturn(buyer);
|
|
when(userMapper.selectById(100L)).thenReturn(buyer);
|
|
|
- when(wechatService.uploadShippingInfo(any(), any(), any(), any(), any(), any(), any())).thenReturn(null);
|
|
|
|
|
|
|
+ when(wechatService.uploadShippingInfo(any(), any(), any(), any(), any(), anyInt(), any())).thenReturn(null);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private void stubBuyerNoOpenid() {
|
|
private void stubBuyerNoOpenid() {
|
|
@@ -93,7 +94,7 @@ public class ProductOrderServiceFulfillmentMultiModeTest {
|
|
|
|
|
|
|
|
// 验证:无 updateById、无微信同步
|
|
// 验证:无 updateById、无微信同步
|
|
|
verify(orderMapper, never()).updateById(any());
|
|
verify(orderMapper, never()).updateById(any());
|
|
|
- verify(wechatService, never()).uploadShippingInfo(any(), any(), any(), any(), any(), any(), any());
|
|
|
|
|
|
|
+ verify(wechatService, never()).uploadShippingInfo(any(), any(), any(), any(), any(), anyInt(), any());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/** 2. 同城发货 → 落库 pending_receipt + 微信同步 logisticsType=2 + 单号/公司透传 */
|
|
/** 2. 同城发货 → 落库 pending_receipt + 微信同步 logisticsType=2 + 单号/公司透传 */
|
|
@@ -104,7 +105,7 @@ public class ProductOrderServiceFulfillmentMultiModeTest {
|
|
|
stubBuyerWithOpenid();
|
|
stubBuyerWithOpenid();
|
|
|
|
|
|
|
|
Result<String> r = orderService.ship(ORDER_NO, "local", "FLASH123", "闪送", null, "13800138000");
|
|
Result<String> r = orderService.ship(ORDER_NO, "local", "FLASH123", "闪送", null, "13800138000");
|
|
|
- assertEquals("已发货", r.getMessage());
|
|
|
|
|
|
|
+ assertEquals("已发货", r.getData());
|
|
|
|
|
|
|
|
// 落库:pending_receipt
|
|
// 落库:pending_receipt
|
|
|
ArgumentCaptor<ProductOrder> persisted = ArgumentCaptor.forClass(ProductOrder.class);
|
|
ArgumentCaptor<ProductOrder> persisted = ArgumentCaptor.forClass(ProductOrder.class);
|
|
@@ -137,7 +138,7 @@ public class ProductOrderServiceFulfillmentMultiModeTest {
|
|
|
|
|
|
|
|
// 正常自提:无单号、无公司
|
|
// 正常自提:无单号、无公司
|
|
|
Result<String> r1 = orderService.ship(ORDER_NO, "selfPickup", null, null, null, null);
|
|
Result<String> r1 = orderService.ship(ORDER_NO, "selfPickup", null, null, null, null);
|
|
|
- assertEquals("已发货", r1.getMessage());
|
|
|
|
|
|
|
+ assertEquals("已发货", r1.getData());
|
|
|
|
|
|
|
|
// 微信同步:logisticsType=4,trackingNo/expressCompany 为 null
|
|
// 微信同步:logisticsType=4,trackingNo/expressCompany 为 null
|
|
|
ArgumentCaptor<Integer> logisticsType = ArgumentCaptor.forClass(Integer.class);
|
|
ArgumentCaptor<Integer> logisticsType = ArgumentCaptor.forClass(Integer.class);
|
|
@@ -151,6 +152,9 @@ public class ProductOrderServiceFulfillmentMultiModeTest {
|
|
|
assertEquals(null, expressCompany.getValue());
|
|
assertEquals(null, expressCompany.getValue());
|
|
|
|
|
|
|
|
// 传入单号 → 拒绝
|
|
// 传入单号 → 拒绝
|
|
|
|
|
+ // R90:首次 ship 已把同一 mock 订单对象状态改为 pending_receipt,负向断言前需复位为 paid,
|
|
|
|
|
+ // 否则会先命中「仅已支付订单可发货」前置守卫(用例状态泄漏,非产品缺陷)。
|
|
|
|
|
+ order.setStatus("paid");
|
|
|
Result<String> r2 = orderService.ship(ORDER_NO, "selfPickup", "ILLEGAL123", null, null, null);
|
|
Result<String> r2 = orderService.ship(ORDER_NO, "selfPickup", "ILLEGAL123", null, null, null);
|
|
|
assertEquals("自提订单无需填写物流信息", r2.getMessage());
|
|
assertEquals("自提订单无需填写物流信息", r2.getMessage());
|
|
|
|
|
|
|
@@ -172,7 +176,7 @@ public class ProductOrderServiceFulfillmentMultiModeTest {
|
|
|
|
|
|
|
|
// 4b. 虚拟商品 paid 状态:正常补发货(走 autoShipVirtualOrder)
|
|
// 4b. 虚拟商品 paid 状态:正常补发货(走 autoShipVirtualOrder)
|
|
|
Result<String> r2 = orderService.ship(ORDER_NO, "virtual", null, null, null, null);
|
|
Result<String> r2 = orderService.ship(ORDER_NO, "virtual", null, null, null, null);
|
|
|
- assertEquals("自动发货成功", r2.getMessage());
|
|
|
|
|
|
|
+ assertEquals("自动发货成功", r2.getData());
|
|
|
// 状态变为 completed
|
|
// 状态变为 completed
|
|
|
ArgumentCaptor<ProductOrder> persisted = ArgumentCaptor.forClass(ProductOrder.class);
|
|
ArgumentCaptor<ProductOrder> persisted = ArgumentCaptor.forClass(ProductOrder.class);
|
|
|
verify(orderMapper, org.mockito.Mockito.atLeastOnce()).updateById(persisted.capture());
|
|
verify(orderMapper, org.mockito.Mockito.atLeastOnce()).updateById(persisted.capture());
|
|
@@ -195,10 +199,10 @@ public class ProductOrderServiceFulfillmentMultiModeTest {
|
|
|
ProductOrder virtualCompleted = virtualCompletedOrder();
|
|
ProductOrder virtualCompleted = virtualCompletedOrder();
|
|
|
when(orderMapper.selectOne(any())).thenReturn(virtualCompleted);
|
|
when(orderMapper.selectOne(any())).thenReturn(virtualCompleted);
|
|
|
Result<String> r3 = orderService.ship(ORDER_NO, "virtual", null, null, null, null);
|
|
Result<String> r3 = orderService.ship(ORDER_NO, "virtual", null, null, null, null);
|
|
|
- assertEquals("该订单已自动交付", r3.getMessage());
|
|
|
|
|
|
|
+ assertEquals("该订单已自动交付", r3.getData());
|
|
|
// 清空后本次不应再调用微信同步(幂等)
|
|
// 清空后本次不应再调用微信同步(幂等)
|
|
|
verify(wechatService, never())
|
|
verify(wechatService, never())
|
|
|
- .uploadShippingInfo(any(), any(), any(), any(), any(), any(), any());
|
|
|
|
|
|
|
+ .uploadShippingInfo(any(), any(), any(), any(), any(), anyInt(), any());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/** 5. 虚拟商品自动发货:支付回调后 → status=completed + 微信 logisticsType=3 + 无单号;
|
|
/** 5. 虚拟商品自动发货:支付回调后 → status=completed + 微信 logisticsType=3 + 无单号;
|
|
@@ -213,7 +217,7 @@ public class ProductOrderServiceFulfillmentMultiModeTest {
|
|
|
// 直接调用私有 autoShipVirtualOrder(通过反射)
|
|
// 直接调用私有 autoShipVirtualOrder(通过反射)
|
|
|
Result<?> r = ReflectionTestUtils.invokeMethod(orderService, "autoShipVirtualOrder", virtualPaid);
|
|
Result<?> r = ReflectionTestUtils.invokeMethod(orderService, "autoShipVirtualOrder", virtualPaid);
|
|
|
assertNotNull(r);
|
|
assertNotNull(r);
|
|
|
- assertEquals("自动发货成功", r.getMessage());
|
|
|
|
|
|
|
+ assertEquals("自动发货成功", r.getData());
|
|
|
|
|
|
|
|
// 状态变为 completed
|
|
// 状态变为 completed
|
|
|
ArgumentCaptor<ProductOrder> persisted = ArgumentCaptor.forClass(ProductOrder.class);
|
|
ArgumentCaptor<ProductOrder> persisted = ArgumentCaptor.forClass(ProductOrder.class);
|
|
@@ -233,10 +237,10 @@ public class ProductOrderServiceFulfillmentMultiModeTest {
|
|
|
stubBuyerNoOpenid();
|
|
stubBuyerNoOpenid();
|
|
|
Result<?> r2 = ReflectionTestUtils.invokeMethod(orderService, "autoShipVirtualOrder", virtualPaid2);
|
|
Result<?> r2 = ReflectionTestUtils.invokeMethod(orderService, "autoShipVirtualOrder", virtualPaid2);
|
|
|
assertNotNull(r2);
|
|
assertNotNull(r2);
|
|
|
- assertEquals("自动发货成功", r2.getMessage());
|
|
|
|
|
|
|
+ assertEquals("自动发货成功", r2.getData());
|
|
|
// 买家无 openid 时不应调用微信
|
|
// 买家无 openid 时不应调用微信
|
|
|
verify(wechatService, never())
|
|
verify(wechatService, never())
|
|
|
- .uploadShippingInfo(any(), any(), any(), any(), any(), any(), any());
|
|
|
|
|
|
|
+ .uploadShippingInfo(any(), any(), any(), any(), any(), anyInt(), any());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/** 6. deliveryMethod=3(两者皆可)不显式传 shipType → 明确错误 */
|
|
/** 6. deliveryMethod=3(两者皆可)不显式传 shipType → 明确错误 */
|