dev --- 3.8.0.A版本, openProject引用 ; formao-live --- 3.7.0.B 版本, formallProject引用
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

163 rivejä
5.1 KiB

  1. package me.chanjar.weixin.api;
  2. import java.util.Map;
  3. import me.chanjar.weixin.api.WxConsts;
  4. import me.chanjar.weixin.api.WxMessageHandler;
  5. import me.chanjar.weixin.api.WxMessageRouter;
  6. import org.testng.Assert;
  7. import org.testng.annotations.DataProvider;
  8. import org.testng.annotations.Test;
  9. import me.chanjar.weixin.bean.WxXmlMessage;
  10. import me.chanjar.weixin.bean.WxXmlOutMessage;
  11. /**
  12. * 测试消息路由器
  13. * @author chanjarster
  14. *
  15. */
  16. @Test
  17. public class WxMessageRouterTest {
  18. @Test(enabled = false)
  19. public void prepare(boolean async, StringBuffer sb, WxMessageRouter router) {
  20. router
  21. .rule()
  22. .async(async)
  23. .msgType(WxConsts.XML_MSG_TEXT).event(WxConsts.EVT_CLICK).eventKey("KEY_1").content("CONTENT_1")
  24. .handler(new WxEchoMessageHandler(sb, "COMBINE_4"))
  25. .end()
  26. .rule()
  27. .async(async)
  28. .msgType(WxConsts.XML_MSG_TEXT).event(WxConsts.EVT_CLICK).eventKey("KEY_1")
  29. .handler(new WxEchoMessageHandler(sb, "COMBINE_3"))
  30. .end()
  31. .rule()
  32. .async(async)
  33. .msgType(WxConsts.XML_MSG_TEXT).event(WxConsts.EVT_CLICK)
  34. .handler(new WxEchoMessageHandler(sb, "COMBINE_2"))
  35. .end()
  36. .rule().async(async).msgType(WxConsts.XML_MSG_TEXT).handler(new WxEchoMessageHandler(sb, WxConsts.XML_MSG_TEXT)).end()
  37. .rule().async(async).event(WxConsts.EVT_CLICK).handler(new WxEchoMessageHandler(sb, WxConsts.EVT_CLICK)).end()
  38. .rule().async(async).eventKey("KEY_1").handler(new WxEchoMessageHandler(sb, "KEY_1")).end()
  39. .rule().async(async).content("CONTENT_1").handler(new WxEchoMessageHandler(sb, "CONTENT_1")).end()
  40. .rule().async(async).rContent(".*bc.*").handler(new WxEchoMessageHandler(sb, "abcd")).end()
  41. .rule().async(async).handler(new WxEchoMessageHandler(sb, "ALL")).end();
  42. ;
  43. }
  44. @Test(dataProvider="messages-1")
  45. public void testSync(WxXmlMessage message, String expected) {
  46. StringBuffer sb = new StringBuffer();
  47. WxMessageRouter router = new WxMessageRouter();
  48. prepare(false, sb, router);
  49. router.route(message);
  50. Assert.assertEquals(sb.toString(), expected);
  51. }
  52. @Test(dataProvider="messages-1")
  53. public void testAsync(WxXmlMessage message, String expected) throws InterruptedException {
  54. StringBuffer sb = new StringBuffer();
  55. WxMessageRouter router = new WxMessageRouter();
  56. prepare(true, sb, router);
  57. router.route(message);
  58. Thread.sleep(500l);
  59. Assert.assertEquals(sb.toString(), expected);
  60. }
  61. public void testConcurrency() throws InterruptedException {
  62. final WxMessageRouter router = new WxMessageRouter();
  63. router.rule().handler(new WxMessageHandler() {
  64. @Override
  65. public WxXmlOutMessage handle(WxXmlMessage wxMessage, Map<String, Object> context) {
  66. return null;
  67. }
  68. }).end();
  69. final WxXmlMessage m = new WxXmlMessage();
  70. Runnable r = new Runnable() {
  71. @Override
  72. public void run() {
  73. router.route(m);
  74. try {
  75. Thread.sleep(1000l);
  76. } catch (InterruptedException e) {
  77. }
  78. }
  79. };
  80. for (int i = 0; i < 10; i++) {
  81. new Thread(r).start();
  82. }
  83. Thread.sleep(1000l * 2);
  84. }
  85. @DataProvider(name="messages-1")
  86. public Object[][] messages2() {
  87. WxXmlMessage message1 = new WxXmlMessage();
  88. message1.setMsgType(WxConsts.XML_MSG_TEXT);
  89. WxXmlMessage message2 = new WxXmlMessage();
  90. message2.setEvent(WxConsts.EVT_CLICK);
  91. WxXmlMessage message3 = new WxXmlMessage();
  92. message3.setEventKey("KEY_1");
  93. WxXmlMessage message4 = new WxXmlMessage();
  94. message4.setContent("CONTENT_1");
  95. WxXmlMessage message5 = new WxXmlMessage();
  96. message5.setContent("BLA");
  97. WxXmlMessage message6 = new WxXmlMessage();
  98. message6.setContent("abcd");
  99. WxXmlMessage c2 = new WxXmlMessage();
  100. c2.setMsgType(WxConsts.XML_MSG_TEXT);
  101. c2.setEvent(WxConsts.EVT_CLICK);
  102. WxXmlMessage c3 = new WxXmlMessage();
  103. c3.setMsgType(WxConsts.XML_MSG_TEXT);
  104. c3.setEvent(WxConsts.EVT_CLICK);
  105. c3.setEventKey("KEY_1");
  106. WxXmlMessage c4 = new WxXmlMessage();
  107. c4.setMsgType(WxConsts.XML_MSG_TEXT);
  108. c4.setEvent(WxConsts.EVT_CLICK);
  109. c4.setEventKey("KEY_1");
  110. c4.setContent("CONTENT_1");
  111. return new Object[][] {
  112. new Object[] { message1, WxConsts.XML_MSG_TEXT + "," },
  113. new Object[] { message2, WxConsts.EVT_CLICK + "," },
  114. new Object[] { message3, "KEY_1," },
  115. new Object[] { message4, "CONTENT_1," },
  116. new Object[] { message5, "ALL," },
  117. new Object[] { message6, "abcd," },
  118. new Object[] { c2, "COMBINE_2," },
  119. new Object[] { c3, "COMBINE_3," },
  120. new Object[] { c4, "COMBINE_4," }
  121. };
  122. }
  123. public static class WxEchoMessageHandler implements WxMessageHandler {
  124. private StringBuffer sb;
  125. private String echoStr;
  126. public WxEchoMessageHandler(StringBuffer sb, String echoStr) {
  127. this.sb = sb;
  128. this.echoStr = echoStr;
  129. }
  130. @Override
  131. public WxXmlOutMessage handle(WxXmlMessage wxMessage, Map<String, Object> context) {
  132. sb.append(this.echoStr).append(',');
  133. return null;
  134. }
  135. }
  136. }