@@ -26,11 +26,11 @@ | |||||
<artifactId>fluent-hc</artifactId> | <artifactId>fluent-hc</artifactId> | ||||
<version>${httpclient.version}</version> | <version>${httpclient.version}</version> | ||||
</dependency> | </dependency> | ||||
<dependency> | |||||
<groupId>org.apache.httpcomponents</groupId> | |||||
<artifactId>httpmime</artifactId> | |||||
<version>${httpclient.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.httpcomponents</groupId> | |||||
<artifactId>httpmime</artifactId> | |||||
<version>${httpclient.version}</version> | |||||
</dependency> | |||||
<dependency> | <dependency> | ||||
<groupId>javax.xml.bind</groupId> | <groupId>javax.xml.bind</groupId> | ||||
<artifactId>jaxb-api</artifactId> | <artifactId>jaxb-api</artifactId> | ||||
@@ -63,10 +63,33 @@ | |||||
<version>1.9.5</version> | <version>1.9.5</version> | ||||
<scope>test</scope> | <scope>test</scope> | ||||
</dependency> | </dependency> | ||||
<dependency> | |||||
<groupId>com.google.inject</groupId> | |||||
<artifactId>guice</artifactId> | |||||
<version>3.0</version> | |||||
<scope>test</scope> | |||||
</dependency> | |||||
<dependency> | <dependency> | ||||
<groupId>org.apache.commons</groupId> | <groupId>org.apache.commons</groupId> | ||||
<artifactId>commons-lang3</artifactId> | <artifactId>commons-lang3</artifactId> | ||||
<version>3.1</version> | <version>3.1</version> | ||||
</dependency> | </dependency> | ||||
</dependencies> | </dependencies> | ||||
<build> | |||||
<plugins> | |||||
<plugin> | |||||
<groupId>org.apache.maven.plugins</groupId> | |||||
<artifactId>maven-surefire-plugin</artifactId> | |||||
<version>2.17</version> | |||||
<configuration> | |||||
<suiteXmlFiles> | |||||
<suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile> | |||||
</suiteXmlFiles> | |||||
</configuration> | |||||
</plugin> | |||||
</plugins> | |||||
</build> | |||||
</project> | </project> |
@@ -0,0 +1,29 @@ | |||||
package chanjarster.weixin.api; | |||||
import java.io.InputStream; | |||||
import javax.xml.bind.JAXBException; | |||||
import chanjarster.weixin.api.WxBaseAPITest.WxXmlConfigStorage; | |||||
import chanjarster.weixin.util.xml.XmlTransformer; | |||||
import com.google.inject.Binder; | |||||
import com.google.inject.Module; | |||||
public class ApiTestModule implements Module { | |||||
@Override | |||||
public void configure(Binder binder) { | |||||
try { | |||||
InputStream is1 = ClassLoader.getSystemResourceAsStream("test-config.xml"); | |||||
WxXmlConfigStorage config = XmlTransformer.fromXml(WxXmlConfigStorage.class, is1); | |||||
WxServiceImpl wxService = new WxServiceImpl(); | |||||
wxService.setWxConfigStorage(config); | |||||
binder.bind(WxServiceImpl.class).toInstance(wxService); | |||||
} catch (JAXBException e) { | |||||
throw new RuntimeException(e); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,113 @@ | |||||
package chanjarster.weixin.api; | |||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import javax.xml.bind.annotation.XmlAccessType; | |||||
import javax.xml.bind.annotation.XmlAccessorType; | |||||
import javax.xml.bind.annotation.XmlRootElement; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import org.testng.Assert; | |||||
import org.testng.annotations.DataProvider; | |||||
import org.testng.annotations.Guice; | |||||
import org.testng.annotations.Test; | |||||
import chanjarster.weixin.bean.result.WxMediaUploadResult; | |||||
import chanjarster.weixin.exception.WxErrorException; | |||||
import com.google.inject.Inject; | |||||
@Test(groups="baseAPI") | |||||
@Guice(modules = ApiTestModule.class) | |||||
public class WxBaseAPITest { | |||||
@Inject | |||||
protected WxServiceImpl wxService; | |||||
private List<String> media_ids = new ArrayList<String>(); | |||||
@Test | |||||
public void testRefreshAccessToken() throws WxErrorException { | |||||
WxConfigStorage configStorage = wxService.wxConfigStorage; | |||||
String before = configStorage.getAccessToken(); | |||||
wxService.refreshAccessToken(); | |||||
String after = configStorage.getAccessToken(); | |||||
Assert.assertNotEquals(before, after); | |||||
Assert.assertTrue(StringUtils.isNotBlank(after)); | |||||
} | |||||
@Test(dependsOnMethods = { "testRefreshAccessToken" }, dataProvider="uploadMedia", enabled = true) | |||||
public void testUploadMedia(String mediaType, String fileType, String fileName) throws WxErrorException, IOException { | |||||
InputStream inputStream = ClassLoader.getSystemResourceAsStream(fileName); | |||||
WxMediaUploadResult res = wxService.uploadMedia(mediaType, fileType, inputStream); | |||||
Assert.assertNotNull(res.getType()); | |||||
Assert.assertNotNull(res.getCreated_at()); | |||||
Assert.assertTrue(res.getMedia_id() != null || res.getThumb_media_id() != null); | |||||
if (res.getMedia_id() != null) { | |||||
media_ids.add(res.getMedia_id()); | |||||
} | |||||
if (res.getThumb_media_id() != null) { | |||||
media_ids.add(res.getThumb_media_id()); | |||||
} | |||||
} | |||||
@DataProvider | |||||
public Object[][] uploadMedia() { | |||||
return new Object[][] { | |||||
new Object[] { WxConsts.MEDIA_IMAGE, WxConsts.FILE_JPG, "mm.jpeg" }, | |||||
new Object[] { WxConsts.MEDIA_VOICE, WxConsts.FILE_MP3, "mm.mp3" }, | |||||
new Object[] { WxConsts.MEDIA_VIDEO, WxConsts.FILE_MP4, "mm.mp4" }, | |||||
new Object[] { WxConsts.MEDIA_THUMB, WxConsts.FILE_JPG, "mm.jpeg" } | |||||
}; | |||||
} | |||||
@Test(dependsOnMethods = { "testUploadMedia" }, dataProvider="downloadMedia") | |||||
public void testDownloadMedia(String media_id) throws WxErrorException { | |||||
wxService.downloadMedia(media_id); | |||||
} | |||||
@DataProvider | |||||
public Object[][] downloadMedia() { | |||||
Object[][] params = new Object[this.media_ids.size()][]; | |||||
for (int i = 0; i < this.media_ids.size(); i++) { | |||||
params[i] = new Object[] { this.media_ids.get(i) }; | |||||
} | |||||
return params; | |||||
} | |||||
@Test(enabled = true) | |||||
public void testCheckSignature() throws WxErrorException { | |||||
String timestamp = "23234235423246"; | |||||
String nonce = "y7didfkcmvnbd90sdofjkiefhsd"; | |||||
String signature = "77b6651628dfb9a64bfb0d3432ee053ac566a459"; | |||||
Assert.assertTrue(wxService.checkSignature(timestamp, nonce, signature)); | |||||
} | |||||
@XmlRootElement(name = "xml") | |||||
@XmlAccessorType(XmlAccessType.FIELD) | |||||
public static class WxXmlConfigStorage extends WxInMemoryConfigStorage { | |||||
protected String openId; | |||||
public String getOpenId() { | |||||
return openId; | |||||
} | |||||
public void setOpenId(String openId) { | |||||
this.openId = openId; | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
return "SimpleWxConfigProvider [appId=" + appId + ", secret=" + secret + ", accessToken=" + accessToken | |||||
+ ", expiresIn=" + expiresIn + ", token=" + token + ", openId=" + openId + "]"; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,30 @@ | |||||
package chanjarster.weixin.api; | |||||
import org.testng.annotations.Guice; | |||||
import org.testng.annotations.Test; | |||||
import com.google.inject.Inject; | |||||
import chanjarster.weixin.api.WxBaseAPITest.WxXmlConfigStorage; | |||||
import chanjarster.weixin.bean.WxCustomMessage; | |||||
import chanjarster.weixin.exception.WxErrorException; | |||||
@Test(dependsOnGroups="baseAPI") | |||||
@Guice(modules = ApiTestModule.class) | |||||
public class WxCustomMessageAPITest { | |||||
@Inject | |||||
protected WxServiceImpl wxService; | |||||
@Test(enabled = true) | |||||
public void testSendCustomMessage() throws WxErrorException { | |||||
WxXmlConfigStorage configProvider = (WxXmlConfigStorage) wxService.wxConfigStorage; | |||||
WxCustomMessage message = new WxCustomMessage(); | |||||
message.setMsgtype(WxConsts.CUSTOM_MSG_TEXT); | |||||
message.setTouser(configProvider.getOpenId()); | |||||
message.setContent("欢迎欢迎,热烈欢迎\n换行测试\n超链接:<a href=\"http://www.baidu.com\">Hello World</a>"); | |||||
wxService.sendCustomMessage(message); | |||||
} | |||||
} |
@@ -0,0 +1,86 @@ | |||||
package chanjarster.weixin.api; | |||||
import javax.xml.bind.JAXBException; | |||||
import org.testng.Assert; | |||||
import org.testng.annotations.DataProvider; | |||||
import org.testng.annotations.Guice; | |||||
import org.testng.annotations.Test; | |||||
import com.google.inject.Inject; | |||||
import chanjarster.weixin.bean.WxMenu; | |||||
import chanjarster.weixin.bean.WxMenu.WxMenuButton; | |||||
import chanjarster.weixin.exception.WxErrorException; | |||||
@Test(dependsOnGroups="baseAPI") | |||||
@Guice(modules = ApiTestModule.class) | |||||
public class WxMenuAPITest { | |||||
@Inject | |||||
protected WxServiceImpl wxService; | |||||
@Test(dataProvider = "menu", enabled = true) | |||||
public void testCreateMenu(WxMenu wxMenu) throws WxErrorException { | |||||
wxService.createMenu(wxMenu); | |||||
} | |||||
@Test(dependsOnMethods = { "testCreateMenu"}, enabled = true) | |||||
public void testGetMenu() throws WxErrorException { | |||||
Assert.assertNotNull(wxService.getMenu()); | |||||
} | |||||
@Test(dependsOnMethods = { "testGetMenu"}, enabled = true) | |||||
public void testDeleteMenu() throws WxErrorException { | |||||
wxService.deleteMenu(); | |||||
} | |||||
@DataProvider(name="menu") | |||||
public Object[][] getMenu() throws JAXBException { | |||||
WxMenu menu = new WxMenu(); | |||||
WxMenuButton button1 = new WxMenuButton(); | |||||
button1.setType("click"); | |||||
button1.setName("今日歌曲"); | |||||
button1.setKey("V1001_TODAY_MUSIC"); | |||||
WxMenuButton button2 = new WxMenuButton(); | |||||
button2.setType("click"); | |||||
button2.setName("歌手简介"); | |||||
button2.setKey("V1001_TODAY_SINGER"); | |||||
WxMenuButton button3 = new WxMenuButton(); | |||||
button3.setName("菜单"); | |||||
menu.getButton().add(button1); | |||||
menu.getButton().add(button2); | |||||
menu.getButton().add(button3); | |||||
WxMenuButton button31 = new WxMenuButton(); | |||||
button31.setType("view"); | |||||
button31.setName("搜索"); | |||||
button31.setUrl("http://www.soso.com/"); | |||||
WxMenuButton button32 = new WxMenuButton(); | |||||
button32.setType("view"); | |||||
button32.setName("视频"); | |||||
button32.setUrl("http://v.qq.com/"); | |||||
WxMenuButton button33 = new WxMenuButton(); | |||||
button33.setType("click"); | |||||
button33.setName("赞一下我们"); | |||||
button33.setKey("V1001_GOOD"); | |||||
button3.getSub_button().add(button31); | |||||
button3.getSub_button().add(button32); | |||||
button3.getSub_button().add(button33); | |||||
return new Object[][] { | |||||
new Object[] { | |||||
menu | |||||
} | |||||
}; | |||||
} | |||||
} |
@@ -46,11 +46,6 @@ public class WxMessageRouterTest { | |||||
Assert.assertEquals(sb.toString(), expected); | Assert.assertEquals(sb.toString(), expected); | ||||
} | } | ||||
@Test() | |||||
public void test() { | |||||
} | |||||
@DataProvider(name="messages-1") | @DataProvider(name="messages-1") | ||||
public Object[][] messages2() { | public Object[][] messages2() { | ||||
WxXmlMessage message1 = new WxXmlMessage(); | WxXmlMessage message1 = new WxXmlMessage(); | ||||
@@ -1,195 +0,0 @@ | |||||
package chanjarster.weixin.api; | |||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import javax.xml.bind.JAXBException; | |||||
import javax.xml.bind.annotation.XmlAccessType; | |||||
import javax.xml.bind.annotation.XmlAccessorType; | |||||
import javax.xml.bind.annotation.XmlRootElement; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import org.testng.Assert; | |||||
import org.testng.annotations.BeforeTest; | |||||
import org.testng.annotations.DataProvider; | |||||
import org.testng.annotations.Test; | |||||
import chanjarster.weixin.bean.WxCustomMessage; | |||||
import chanjarster.weixin.bean.WxMenu; | |||||
import chanjarster.weixin.bean.WxMenu.WxMenuButton; | |||||
import chanjarster.weixin.bean.result.WxMediaUploadResult; | |||||
import chanjarster.weixin.exception.WxErrorException; | |||||
import chanjarster.weixin.util.xml.XmlTransformer; | |||||
public class WxServiceTest { | |||||
private WxServiceImpl wxService; | |||||
private List<String> media_ids = new ArrayList<String>(); | |||||
@BeforeTest | |||||
public void prepare() throws JAXBException { | |||||
this.wxService = null; | |||||
InputStream is1 = ClassLoader.getSystemResourceAsStream("test-config.xml"); | |||||
WxXmlConfigStorage config = XmlTransformer.fromXml(WxXmlConfigStorage.class, is1); | |||||
this.wxService = new WxServiceImpl(); | |||||
this.wxService.setWxConfigStorage(config); | |||||
} | |||||
@Test() | |||||
public void testRefreshAccessToken() throws WxErrorException { | |||||
WxConfigStorage configStorage = wxService.wxConfigStorage; | |||||
String before = configStorage.getAccessToken(); | |||||
wxService.refreshAccessToken(); | |||||
String after = configStorage.getAccessToken(); | |||||
Assert.assertNotEquals(before, after); | |||||
Assert.assertTrue(StringUtils.isNotBlank(after)); | |||||
} | |||||
@Test(dependsOnMethods = "testRefreshAccessToken", enabled = true) | |||||
public void sendCustomMessage() throws WxErrorException { | |||||
WxXmlConfigStorage configProvider = (WxXmlConfigStorage) wxService.wxConfigStorage; | |||||
WxCustomMessage message = new WxCustomMessage(); | |||||
message.setMsgtype(WxConsts.CUSTOM_MSG_TEXT); | |||||
message.setTouser(configProvider.getOpenId()); | |||||
message.setContent("欢迎欢迎,热烈欢迎\n换行测试\n超链接:<a href=\"http://www.baidu.com\">Hello World</a>"); | |||||
wxService.sendCustomMessage(message); | |||||
} | |||||
@Test(dataProvider = "menu", dependsOnMethods = "testRefreshAccessToken", enabled = true) | |||||
public void testCreateMenu(WxMenu wxMenu) throws WxErrorException { | |||||
wxService.createMenu(wxMenu); | |||||
} | |||||
@Test(dependsOnMethods = { "testRefreshAccessToken" , "testCreateMenu"}, enabled = true) | |||||
public void testGetMenu() throws WxErrorException { | |||||
Assert.assertNotNull(wxService.getMenu()); | |||||
} | |||||
@Test(dependsOnMethods = { "testRefreshAccessToken", "testGetMenu"}, enabled = true) | |||||
public void testDeleteMenu() throws WxErrorException { | |||||
wxService.deleteMenu(); | |||||
} | |||||
@Test(dependsOnMethods = { "testRefreshAccessToken" }, dataProvider="uploadMedia", enabled = true) | |||||
public void testUploadMedia1(String mediaType, String fileType, String fileName) throws WxErrorException, IOException { | |||||
InputStream inputStream = ClassLoader.getSystemResourceAsStream(fileName); | |||||
WxMediaUploadResult res = wxService.uploadMedia(mediaType, fileType, inputStream); | |||||
Assert.assertNotNull(res.getType()); | |||||
Assert.assertNotNull(res.getCreated_at()); | |||||
Assert.assertTrue(res.getMedia_id() != null || res.getThumb_media_id() != null); | |||||
if (res.getMedia_id() != null) { | |||||
media_ids.add(res.getMedia_id()); | |||||
} | |||||
if (res.getThumb_media_id() != null) { | |||||
media_ids.add(res.getThumb_media_id()); | |||||
} | |||||
} | |||||
@DataProvider | |||||
public Object[][] uploadMedia() { | |||||
return new Object[][] { | |||||
new Object[] { WxConsts.MEDIA_IMAGE, WxConsts.FILE_JPG, "mm.jpeg" }, | |||||
new Object[] { WxConsts.MEDIA_VOICE, WxConsts.FILE_MP3, "mm.mp3" }, | |||||
new Object[] { WxConsts.MEDIA_VIDEO, WxConsts.FILE_MP4, "mm.mp4" }, | |||||
new Object[] { WxConsts.MEDIA_THUMB, WxConsts.FILE_JPG, "mm.jpeg" } | |||||
}; | |||||
} | |||||
@Test(dependsOnMethods = { "testUploadMedia1" }, dataProvider="downloadMedia") | |||||
public void testDownloadMedia(String media_id) throws WxErrorException { | |||||
wxService.downloadMedia(media_id); | |||||
} | |||||
@DataProvider | |||||
public Object[][] downloadMedia() { | |||||
Object[][] params = new Object[this.media_ids.size()][]; | |||||
for (int i = 0; i < this.media_ids.size(); i++) { | |||||
params[i] = new Object[] { this.media_ids.get(i) }; | |||||
} | |||||
return params; | |||||
} | |||||
@Test(enabled = true) | |||||
public void testCheckSignature() throws WxErrorException { | |||||
String timestamp = "23234235423246"; | |||||
String nonce = "y7didfkcmvnbd90sdofjkiefhsd"; | |||||
String signature = "77b6651628dfb9a64bfb0d3432ee053ac566a459"; | |||||
Assert.assertTrue(wxService.checkSignature(timestamp, nonce, signature)); | |||||
} | |||||
@DataProvider(name="menu") | |||||
public Object[][] getMenu() throws JAXBException { | |||||
WxMenu menu = new WxMenu(); | |||||
WxMenuButton button1 = new WxMenuButton(); | |||||
button1.setType("click"); | |||||
button1.setName("今日歌曲"); | |||||
button1.setKey("V1001_TODAY_MUSIC"); | |||||
WxMenuButton button2 = new WxMenuButton(); | |||||
button2.setType("click"); | |||||
button2.setName("歌手简介"); | |||||
button2.setKey("V1001_TODAY_SINGER"); | |||||
WxMenuButton button3 = new WxMenuButton(); | |||||
button3.setName("菜单"); | |||||
menu.getButton().add(button1); | |||||
menu.getButton().add(button2); | |||||
menu.getButton().add(button3); | |||||
WxMenuButton button31 = new WxMenuButton(); | |||||
button31.setType("view"); | |||||
button31.setName("搜索"); | |||||
button31.setUrl("http://www.soso.com/"); | |||||
WxMenuButton button32 = new WxMenuButton(); | |||||
button32.setType("view"); | |||||
button32.setName("视频"); | |||||
button32.setUrl("http://v.qq.com/"); | |||||
WxMenuButton button33 = new WxMenuButton(); | |||||
button33.setType("click"); | |||||
button33.setName("赞一下我们"); | |||||
button33.setKey("V1001_GOOD"); | |||||
button3.getSub_button().add(button31); | |||||
button3.getSub_button().add(button32); | |||||
button3.getSub_button().add(button33); | |||||
return new Object[][] { | |||||
new Object[] { | |||||
menu | |||||
} | |||||
}; | |||||
} | |||||
@XmlRootElement(name = "xml") | |||||
@XmlAccessorType(XmlAccessType.FIELD) | |||||
public static class WxXmlConfigStorage extends WxInMemoryConfigStorage { | |||||
protected String openId; | |||||
public String getOpenId() { | |||||
return openId; | |||||
} | |||||
public void setOpenId(String openId) { | |||||
this.openId = openId; | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
return "SimpleWxConfigProvider [appId=" + appId + ", secret=" + secret + ", accessToken=" + accessToken | |||||
+ ", expiresIn=" + expiresIn + ", token=" + token + ", openId=" + openId + "]"; | |||||
} | |||||
} | |||||
} |
@@ -57,7 +57,7 @@ public class WxMenuTest { | |||||
Assert.assertEquals(menu.toJson(), json); | Assert.assertEquals(menu.toJson(), json); | ||||
} | } | ||||
@Test(dataProvider="wxReturnMenu") | |||||
@DataProvider | |||||
public Object[][] wxReturnMenu() { | public Object[][] wxReturnMenu() { | ||||
Object[][] res = menuJson(); | Object[][] res = menuJson(); | ||||
String json = "{ \"menu\" : " + res[0][0] + " }"; | String json = "{ \"menu\" : " + res[0][0] + " }"; | ||||
@@ -0,0 +1,22 @@ | |||||
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > | |||||
<suite name="Weixin-java-tool-suite" verbose="1"> | |||||
<test name="API_Test"> | |||||
<classes> | |||||
<class name="chanjarster.weixin.api.WxBaseAPITest" /> | |||||
<class name="chanjarster.weixin.api.WxCustomMessageAPITest" /> | |||||
<class name="chanjarster.weixin.api.WxMenuAPITest" /> | |||||
<class name="chanjarster.weixin.api.WxMessageRouterTest" /> | |||||
</classes> | |||||
</test> | |||||
<test name="Util_Test"> | |||||
<classes> | |||||
<class name="chanjarster.weixin.bean.WxAccessTokenTest" /> | |||||
<class name="chanjarster.weixin.bean.WxCustomMessageTest" /> | |||||
<class name="chanjarster.weixin.bean.WxErrorTest" /> | |||||
<class name="chanjarster.weixin.bean.WxMenuTest" /> | |||||
<class name="chanjarster.weixin.bean.WxXmlMessageTest" /> | |||||
</classes> | |||||
</test> | |||||
</suite> |