CardDetailServiceImplTest.java 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package com.mangoo.rating.recommend.cart;
  2. import com.mangoo.rating.recommend.AjaxResult;
  3. import com.mangoo.rating.recommend.manager.ActiveBatchManager;
  4. import com.mangoo.rating.recommend.manager.CardPopManager;
  5. import com.mangoo.rating.recommend.manager.CardValueHistoryManager;
  6. import com.mangoo.rating.recommend.manager.RatingRecommendRuleManager;
  7. import com.mangoo.rating.recommend.po.CardPopPO;
  8. import com.mangoo.rating.recommend.po.CardValueHistoryPO;
  9. import com.mangoo.rating.recommend.po.RatingRecommendRulePO;
  10. import com.mangoo.rating.recommend.response.recommend.CardDetailVO;
  11. import com.mangoo.rating.recommend.request.recommend.CardDetailRequest;
  12. import com.mangoo.rating.recommend.service.impl.CardDetailServiceImpl;
  13. import org.junit.jupiter.api.BeforeEach;
  14. import org.junit.jupiter.api.Test;
  15. import org.junit.jupiter.api.extension.ExtendWith;
  16. import org.mockito.ArgumentCaptor;
  17. import org.mockito.Captor;
  18. import org.mockito.InjectMocks;
  19. import org.mockito.Mock;
  20. import org.mockito.junit.jupiter.MockitoExtension;
  21. import java.math.BigDecimal;
  22. import java.time.LocalDate;
  23. import java.util.Arrays;
  24. import java.util.Collections;
  25. import static org.junit.jupiter.api.Assertions.assertEquals;
  26. import static org.junit.jupiter.api.Assertions.assertNotEquals;
  27. import static org.junit.jupiter.api.Assertions.assertNull;
  28. import static org.mockito.ArgumentMatchers.eq;
  29. import static org.mockito.ArgumentMatchers.isNull;
  30. import static org.mockito.Mockito.lenient;
  31. import static org.mockito.Mockito.verify;
  32. import static org.mockito.Mockito.when;
  33. /**
  34. * CardDetailServiceImpl Mockito 单测
  35. *
  36. * @author gengjintao
  37. * @date 2026/06/25
  38. */
  39. @ExtendWith(MockitoExtension.class)
  40. class CardDetailServiceImplTest {
  41. @Mock
  42. private RatingRecommendRuleManager ruleManager;
  43. @Mock
  44. private CardPopManager cardPopManager;
  45. @Mock
  46. private CardValueHistoryManager cardValueHistoryManager;
  47. @Mock
  48. private ActiveBatchManager activeBatchManager;
  49. @InjectMocks
  50. private CardDetailServiceImpl service;
  51. @Captor
  52. private ArgumentCaptor<LocalDate> dateCaptor;
  53. @BeforeEach
  54. void setUp() {
  55. // 默认桩:有生效批次 B1,POP 与趋势默认空(lenient 避免未使用桩报错)
  56. lenient().when(activeBatchManager.selectActiveBatchNo()).thenReturn("B1");
  57. lenient().when(cardPopManager.selectByCardId(eq("C1"), eq("B1"))).thenReturn(Collections.emptyList());
  58. lenient().when(cardValueHistoryManager.selectTrend(eq("C1"), org.mockito.ArgumentMatchers.any())).thenReturn(Collections.emptyList());
  59. }
  60. /** 构造一条标准规则 PO */
  61. private RatingRecommendRulePO rule() {
  62. RatingRecommendRulePO r = new RatingRecommendRulePO();
  63. r.setCardId("C1");
  64. r.setCardNo("066/080");
  65. r.setPlayer("AIPOM");
  66. r.setCardYear("2026");
  67. r.setSeries("pokemon.M2.JNP");
  68. r.setCardSet("BASE");
  69. r.setCurrentValue(new BigDecimal("15"));
  70. r.setValueChangePct(new BigDecimal("7.05"));
  71. r.setValueMin(new BigDecimal("10"));
  72. r.setValueMax(new BigDecimal("45"));
  73. return r;
  74. }
  75. /** 取状态码(Map 风格,成功 0) */
  76. private int code(AjaxResult r) {
  77. return ((Number) r.get("code")).intValue();
  78. }
  79. /** 取 data(Map 风格) */
  80. private CardDetailVO data(AjaxResult r) {
  81. return (CardDetailVO) r.get("data");
  82. }
  83. /** 构造详情查询请求对象 */
  84. private CardDetailRequest reqOf(String cardId, String period) {
  85. CardDetailRequest req = new CardDetailRequest();
  86. req.setCardId(cardId);
  87. req.setPeriod(period);
  88. return req;
  89. }
  90. @Test
  91. void 正常_组装详情() {
  92. when(ruleManager.selectByCardId("C1", "B1")).thenReturn(rule());
  93. CardPopPO pop = new CardPopPO();
  94. pop.setCardId("C1");
  95. pop.setAgency("PSA");
  96. pop.setGradeAll(660);
  97. pop.setGrade10(25);
  98. when(cardPopManager.selectByCardId("C1", "B1")).thenReturn(Collections.singletonList(pop));
  99. CardValueHistoryPO h = new CardValueHistoryPO();
  100. h.setCardId("C1");
  101. h.setPrice(new BigDecimal("12"));
  102. h.setRecordDate(LocalDate.now().minusDays(1));
  103. when(cardValueHistoryManager.selectTrend(eq("C1"), org.mockito.ArgumentMatchers.any())).thenReturn(Arrays.asList(h));
  104. AjaxResult result = service.getDetail(reqOf("C1", "30d"));
  105. assertEquals(0, code(result));
  106. CardDetailVO d = data(result);
  107. assertEquals("AIPOM", d.getName());
  108. assertEquals("066/080", d.getCardNo());
  109. assertEquals(new BigDecimal("15"), d.getValue().getCurrent());
  110. assertEquals(1, d.getPops().size());
  111. assertEquals("PSA", d.getPops().get(0).getAgency());
  112. assertEquals(1, d.getTrend().size());
  113. }
  114. @Test
  115. void 无生效批次_返回error() {
  116. when(activeBatchManager.selectActiveBatchNo()).thenReturn(null);
  117. AjaxResult result = service.getDetail(reqOf("C1", "30d"));
  118. assertNotEquals(0, code(result));
  119. }
  120. @Test
  121. void 卡片不存在_返回error() {
  122. when(ruleManager.selectByCardId("C1", "B1")).thenReturn(null);
  123. AjaxResult result = service.getDetail(reqOf("C1", "30d"));
  124. assertNotEquals(0, code(result));
  125. }
  126. @Test
  127. void cardId为空_返回error() {
  128. AjaxResult result = service.getDetail(reqOf(" ", "30d"));
  129. assertNotEquals(0, code(result));
  130. }
  131. @Test
  132. void period_7d_起始为7天前() {
  133. when(ruleManager.selectByCardId("C1", "B1")).thenReturn(rule());
  134. service.getDetail(reqOf("C1", "7d"));
  135. verify(cardValueHistoryManager).selectTrend(eq("C1"), dateCaptor.capture());
  136. assertEquals(LocalDate.now().minusDays(7), dateCaptor.getValue());
  137. }
  138. @Test
  139. void period_all_起始为null() {
  140. when(ruleManager.selectByCardId("C1", "B1")).thenReturn(rule());
  141. service.getDetail(reqOf("C1", "all"));
  142. verify(cardValueHistoryManager).selectTrend(eq("C1"), isNull());
  143. }
  144. }