package com.water.revenue; import com.water.revenue.entity.FaqItem; import com.water.revenue.entity.IntentRule; import com.water.revenue.entity.WxPayOrder; import com.water.revenue.mapper.FaqItemMapper; import com.water.revenue.mapper.IntentRuleMapper; import com.water.revenue.mapper.WxPayOrderMapper; import com.water.revenue.service.wxhall.FaqService; import com.water.revenue.service.wxhall.IntentService; import com.water.revenue.service.wxhall.WxPayService; 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.List; import java.util.Map; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) class WxHallServiceTest { @Mock private WxPayOrderMapper wxPayOrderMapper; @Mock private FaqItemMapper faqItemMapper; @Mock private IntentRuleMapper intentRuleMapper; @InjectMocks private WxPayService wxPayService; @InjectMocks private FaqService faqService; @InjectMocks private IntentService intentService; @Test void testUnifiedOrder() { when(wxPayOrderMapper.insert(any())).thenReturn(1); when(wxPayOrderMapper.updateById(any())).thenReturn(1); Map result = wxPayService.unifiedOrder( "openid123", "C001", "2024-01", new BigDecimal("50.00"), null); assertNotNull(result.get("outTradeNo")); assertEquals(5000, result.get("totalFee")); assertNotNull(result.get("prepayId")); verify(wxPayOrderMapper).insert(any(WxPayOrder.class)); } @Test void testPayNotify() { WxPayOrder order = new WxPayOrder(); order.setOutTradeNo("WXPAY20240101000001"); order.setStatus("pending"); when(wxPayOrderMapper.selectByOutTradeNo(any())).thenReturn(order); when(wxPayOrderMapper.updateById(any())).thenReturn(1); Map xmlData = Map.of( "out_trade_no", "WXPAY20240101000001", "transaction_id", "TX123", "result_code", "SUCCESS", "sign", "test_sign" ); Map result = wxPayService.payNotify(xmlData); assertEquals("SUCCESS", result.get("return_code")); verify(wxPayOrderMapper).updateById(any(WxPayOrder.class)); } @Test void testRefund() { WxPayOrder order = new WxPayOrder(); order.setOutTradeNo("WXPAY001"); order.setStatus("success"); order.setAmount(new BigDecimal("50.00")); when(wxPayOrderMapper.selectByOutTradeNo(any())).thenReturn(order); when(wxPayOrderMapper.updateById(any())).thenReturn(1); Map result = wxPayService.refund("WXPAY001", new BigDecimal("30.00"), "用户申请"); assertEquals("refunded", result.get("status")); assertEquals(new BigDecimal("30.00"), result.get("refundAmount")); } @Test void testSearchFaq() { FaqItem faq = new FaqItem(); faq.setId(1L); faq.setQuestion("如何查询水费?"); faq.setAnswer("通过公众号查询"); when(faqItemMapper.selectList(any())).thenReturn(List.of(faq)); List results = faqService.searchFaq("水费"); assertFalse(results.isEmpty()); assertEquals(1, results.size()); } @Test void testGetHotFaqs() { FaqItem faq = new FaqItem(); faq.setHitCount(100); when(faqItemMapper.selectList(any())).thenReturn(List.of(faq)); List results = faqService.getHotFaqs(5); assertFalse(results.isEmpty()); } @Test void testIntentResolve() { IntentRule rule = new IntentRule(); rule.setId(1L); rule.setPattern(".*查.*账单.*"); rule.setIntentType("QUERY_BILL"); rule.setResponse("正在查询..."); rule.setHitCount(0); when(intentRuleMapper.selectList(any())).thenReturn(List.of(rule)); when(intentRuleMapper.updateById(any())).thenReturn(1); Map result = intentService.resolve("我想查账单"); assertNotNull(result); assertEquals("QUERY_BILL", result.get("intentType")); } @Test void testIntentResolveNoMatch() { when(intentRuleMapper.selectList(any())).thenReturn(List.of()); Map result = intentService.resolve("今天天气怎么样"); assertNotNull(result); assertEquals("UNKNOWN", result.get("intentType")); } @Test void testCreateFaq() { FaqItem faq = new FaqItem(); faq.setQuestion("新问题"); faq.setAnswer("新答案"); faq.setCategory("其他"); when(faqItemMapper.insert(any())).thenReturn(1); FaqItem result = faqService.createFaq(faq); assertNotNull(result); assertEquals("新问题", result.getQuestion()); verify(faqItemMapper).insert(any(FaqItem.class)); } }