Files
water-management-system/wm-revenue/src/test/java/com/water/revenue/WxHallServiceTest.java
T
bot_dev2 69fd9d7c41 feat(wm-revenue): #57 微信网厅(微信支付+AI客服+意图匹配)
- WxPayService: 统一下单/支付回调/退款/订单查询
- FaqService: FAQ CRUD/关键词搜索/热门推荐/分类查询
- IntentService: 意图识别(正则匹配)/批量解析/规则管理
- 3个Controller + 15+ API端点 (/api/revenue/wxpay|faq|intent/*)
- Entity: WxPayOrder, FaqItem, IntentRule
- DDL: rev_wx_pay_order/rev_faq_item/rev_intent_rule + 8个索引
- 8个单元测试
2026-06-14 16:43:00 +08:00

147 lines
5.0 KiB
Java

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<String, Object> 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<String, String> xmlData = Map.of(
"out_trade_no", "WXPAY20240101000001",
"transaction_id", "TX123",
"result_code", "SUCCESS",
"sign", "test_sign"
);
Map<String, Object> 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<String, Object> 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<FaqItem> 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<FaqItem> 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<String, Object> result = intentService.resolve("我想查账单");
assertNotNull(result);
assertEquals("QUERY_BILL", result.get("intentType"));
}
@Test
void testIntentResolveNoMatch() {
when(intentRuleMapper.selectList(any())).thenReturn(List.of());
Map<String, Object> 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));
}
}