Commit cc853a2b92a30381a07f6d42b6d7737bff5f4f87
1 parent
15cca8f3
mall + pay:
1. 支付订单的状态同步 Job[单测]
Showing
2 changed files
with
107 additions
and
2 deletions
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceImpl.java
| @@ -40,7 +40,6 @@ import org.springframework.transaction.annotation.Transactional; | @@ -40,7 +40,6 @@ import org.springframework.transaction.annotation.Transactional; | ||
| 40 | import org.springframework.validation.annotation.Validated; | 40 | import org.springframework.validation.annotation.Validated; |
| 41 | 41 | ||
| 42 | import javax.annotation.Resource; | 42 | import javax.annotation.Resource; |
| 43 | -import java.time.Duration; | ||
| 44 | import java.time.LocalDateTime; | 43 | import java.time.LocalDateTime; |
| 45 | import java.util.List; | 44 | import java.util.List; |
| 46 | import java.util.Objects; | 45 | import java.util.Objects; |
| @@ -155,7 +154,6 @@ public class PayOrderServiceImpl implements PayOrderService { | @@ -155,7 +154,6 @@ public class PayOrderServiceImpl implements PayOrderService { | ||
| 155 | .setReturnUrl(reqVO.getReturnUrl()) | 154 | .setReturnUrl(reqVO.getReturnUrl()) |
| 156 | // 订单相关字段 | 155 | // 订单相关字段 |
| 157 | .setPrice(order.getPrice()).setExpireTime(order.getExpireTime()); | 156 | .setPrice(order.getPrice()).setExpireTime(order.getExpireTime()); |
| 158 | - unifiedOrderReqDTO.setExpireTime(LocalDateTimeUtils.addTime(Duration.ofSeconds(70))); // TODO 芋艿:稍后删除掉 | ||
| 159 | PayOrderRespDTO unifiedOrderResp = client.unifiedOrder(unifiedOrderReqDTO); | 157 | PayOrderRespDTO unifiedOrderResp = client.unifiedOrder(unifiedOrderReqDTO); |
| 160 | 158 | ||
| 161 | // 4. 如果调用直接支付成功,则直接更新支付单状态为成功。例如说:付款码支付,免密支付时,就直接验证支付成功 | 159 | // 4. 如果调用直接支付成功,则直接更新支付单状态为成功。例如说:付款码支付,免密支付时,就直接验证支付成功 |
yudao-module-pay/yudao-module-pay-biz/src/test/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceTest.java
| @@ -36,6 +36,7 @@ import org.springframework.context.annotation.Import; | @@ -36,6 +36,7 @@ import org.springframework.context.annotation.Import; | ||
| 36 | 36 | ||
| 37 | import javax.annotation.Resource; | 37 | import javax.annotation.Resource; |
| 38 | import java.time.Duration; | 38 | import java.time.Duration; |
| 39 | +import java.time.LocalDateTime; | ||
| 39 | import java.util.List; | 40 | import java.util.List; |
| 40 | 41 | ||
| 41 | import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*; | 42 | import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*; |
| @@ -849,4 +850,110 @@ public class PayOrderServiceTest extends BaseDbAndRedisUnitTest { | @@ -849,4 +850,110 @@ public class PayOrderServiceTest extends BaseDbAndRedisUnitTest { | ||
| 849 | assertPojoEquals(dbOrderExtension, orderExtension); | 850 | assertPojoEquals(dbOrderExtension, orderExtension); |
| 850 | } | 851 | } |
| 851 | 852 | ||
| 853 | + @Test | ||
| 854 | + public void testSyncOrder_payClientNotFound() { | ||
| 855 | + // 准备参数 | ||
| 856 | + LocalDateTime minCreateTime = LocalDateTime.now().minus(Duration.ofMinutes(10)); | ||
| 857 | + // mock 数据(PayOrderExtensionDO) | ||
| 858 | + PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, | ||
| 859 | + o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) | ||
| 860 | + .setCreateTime(LocalDateTime.now())); | ||
| 861 | + orderExtensionMapper.insert(orderExtension); | ||
| 862 | + | ||
| 863 | + // 调用 | ||
| 864 | + int count = orderService.syncOrder(minCreateTime); | ||
| 865 | + // 断言 | ||
| 866 | + assertEquals(count, 0); | ||
| 867 | + } | ||
| 868 | + | ||
| 869 | + @Test | ||
| 870 | + public void testSyncOrder_exception() { | ||
| 871 | + // 准备参数 | ||
| 872 | + LocalDateTime minCreateTime = LocalDateTime.now().minus(Duration.ofMinutes(10)); | ||
| 873 | + // mock 数据(PayOrderExtensionDO) | ||
| 874 | + PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, | ||
| 875 | + o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) | ||
| 876 | + .setChannelId(10L) | ||
| 877 | + .setCreateTime(LocalDateTime.now())); | ||
| 878 | + orderExtensionMapper.insert(orderExtension); | ||
| 879 | + // mock 方法(PayClient) | ||
| 880 | + PayClient client = mock(PayClient.class); | ||
| 881 | + when(payClientFactory.getPayClient(eq(10L))).thenReturn(client); | ||
| 882 | + // mock 方法(PayClient 异常) | ||
| 883 | + when(client.getOrder(any())).thenThrow(new RuntimeException()); | ||
| 884 | + | ||
| 885 | + // 调用 | ||
| 886 | + int count = orderService.syncOrder(minCreateTime); | ||
| 887 | + // 断言 | ||
| 888 | + assertEquals(count, 0); | ||
| 889 | + } | ||
| 890 | + | ||
| 891 | + @Test | ||
| 892 | + public void testSyncOrder_orderSuccess() { | ||
| 893 | + PayOrderServiceImpl payOrderServiceImpl = mock(PayOrderServiceImpl.class); | ||
| 894 | + try (MockedStatic<SpringUtil> springUtilMockedStatic = mockStatic(SpringUtil.class)) { | ||
| 895 | + springUtilMockedStatic.when(() -> SpringUtil.getBean(eq(PayOrderServiceImpl.class))) | ||
| 896 | + .thenReturn(payOrderServiceImpl); | ||
| 897 | + | ||
| 898 | + // 准备参数 | ||
| 899 | + LocalDateTime minCreateTime = LocalDateTime.now().minus(Duration.ofMinutes(10)); | ||
| 900 | + // mock 数据(PayOrderExtensionDO) | ||
| 901 | + PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, | ||
| 902 | + o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) | ||
| 903 | + .setChannelId(10L).setNo("P110") | ||
| 904 | + .setCreateTime(LocalDateTime.now())); | ||
| 905 | + orderExtensionMapper.insert(orderExtension); | ||
| 906 | + // mock 方法(PayClient) | ||
| 907 | + PayClient client = mock(PayClient.class); | ||
| 908 | + when(payClientFactory.getPayClient(eq(10L))).thenReturn(client); | ||
| 909 | + // mock 方法(PayClient 成功返回) | ||
| 910 | + PayOrderRespDTO respDTO = randomPojo(PayOrderRespDTO.class, | ||
| 911 | + o -> o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus())); | ||
| 912 | + when(client.getOrder(eq("P110"))).thenReturn(respDTO); | ||
| 913 | + // mock 方法(PayChannelDO) | ||
| 914 | + PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L)); | ||
| 915 | + when(channelService.validPayChannel(eq(10L))).thenReturn(channel); | ||
| 916 | + | ||
| 917 | + // 调用 | ||
| 918 | + int count = orderService.syncOrder(minCreateTime); | ||
| 919 | + // 断言 | ||
| 920 | + assertEquals(count, 1); | ||
| 921 | + verify(payOrderServiceImpl).notifyOrder(same(channel), same(respDTO)); | ||
| 922 | + } | ||
| 923 | + } | ||
| 924 | + | ||
| 925 | + @Test | ||
| 926 | + public void testSyncOrder_orderClosed() { | ||
| 927 | + PayOrderServiceImpl payOrderServiceImpl = mock(PayOrderServiceImpl.class); | ||
| 928 | + try (MockedStatic<SpringUtil> springUtilMockedStatic = mockStatic(SpringUtil.class)) { | ||
| 929 | + springUtilMockedStatic.when(() -> SpringUtil.getBean(eq(PayOrderServiceImpl.class))) | ||
| 930 | + .thenReturn(payOrderServiceImpl); | ||
| 931 | + | ||
| 932 | + // 准备参数 | ||
| 933 | + LocalDateTime minCreateTime = LocalDateTime.now().minus(Duration.ofMinutes(10)); | ||
| 934 | + // mock 数据(PayOrderExtensionDO) | ||
| 935 | + PayOrderExtensionDO orderExtension = randomPojo(PayOrderExtensionDO.class, | ||
| 936 | + o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) | ||
| 937 | + .setChannelId(10L).setNo("P110") | ||
| 938 | + .setCreateTime(LocalDateTime.now())); | ||
| 939 | + orderExtensionMapper.insert(orderExtension); | ||
| 940 | + // mock 方法(PayClient) | ||
| 941 | + PayClient client = mock(PayClient.class); | ||
| 942 | + when(payClientFactory.getPayClient(eq(10L))).thenReturn(client); | ||
| 943 | + // mock 方法(PayClient 成功返回) | ||
| 944 | + PayOrderRespDTO respDTO = randomPojo(PayOrderRespDTO.class, | ||
| 945 | + o -> o.setStatus(PayOrderStatusEnum.CLOSED.getStatus())); | ||
| 946 | + when(client.getOrder(eq("P110"))).thenReturn(respDTO); | ||
| 947 | + // mock 方法(PayChannelDO) | ||
| 948 | + PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setId(10L)); | ||
| 949 | + when(channelService.validPayChannel(eq(10L))).thenReturn(channel); | ||
| 950 | + | ||
| 951 | + // 调用 | ||
| 952 | + int count = orderService.syncOrder(minCreateTime); | ||
| 953 | + // 断言 | ||
| 954 | + assertEquals(count, 0); | ||
| 955 | + verify(payOrderServiceImpl).notifyOrder(same(channel), same(respDTO)); | ||
| 956 | + } | ||
| 957 | + } | ||
| 958 | + | ||
| 852 | } | 959 | } |