我正在尝试使用Fitnesse
框架创建一个测试夹具,我想测试一个从服务器检索数据的函数(RESTFUL服务)。我的测试用例非常简单:
public class FriendListActivityFixture extends ColumnFixture {
public int URL;
public String test() {
JSONArray array = JsonHelper.getJsonArrayFromUrl("http://107.22.209.62/android/get_users.php");
return array.toString();
}
}
public static JSONArray getJsonArrayFromUrl(String url) {
InputStream input = null;
String result = "";
JSONArray jsonArray = null;
try {
HttpClient httpclient = CustomHttpClient.getHttpClient();
HttpPost httppost = new HttpPost(url);
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
input = entity.getContent();
}
catch (Exception e) {
Log.e(TAG + ".getJsonArrayFromUrl(String url)", "Error in http connection " + e.toString());
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(input, "iso-8859-1"), 8);
StringBuilder content = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
content.append(line + "\n");
}
input.close();
result = content.toString();
}
catch (Exception e) {
Log.e(TAG + ".getJsonArrayFromUrl(String url)", "Error parsing result " + e.toString());
}
try {
jsonArray = new JSONArray(result);
}
catch (JSONException e) {
Log.e(TAG + "getJsonArrayFromUrl(String url)", "Error converting data " + e.toString());
}
return jsonArray;
}
以下是Fitnesse
测试页:!path fitnesse.jar
!path C:\Program Files (x86)\Android\android-sdk\platforms\android-10\android.jar
!path C:\Users\chan\git\Spotr\Spotr\bin\classes
!|com.csun.spotr.fitnesse.FriendListActivityFixture|
|URL|test?|
|0|"wwa"|
由于它只是一个演示,我的测试目前可能看起来有点傻。不幸的是,我一直收到这些错误:
java.lang.RuntimeException: Stub!
at android.util.Log.e(Log.java:15)
at com.csun.spotr.util.JsonHelper.getJsonArrayFromUrl(JsonHelper.java:75)
at com.csun.spotr.fitnesse.FriendListActivityFixture.test(FriendListActivityFixture.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at fit.TypeAdapter.invoke(TypeAdapter.java:109)
at fit.TypeAdapter.get(TypeAdapter.java:97)
at fit.Fixture$CellComparator.compareCellToResult(Fixture.java:371)
at fit.Fixture$CellComparator.access$100(Fixture.java:357)
at fit.Fixture.compareCellToResult(Fixture.java:299)
at fit.Fixture.check(Fixture.java:295)
at fit.ColumnFixture.check(ColumnFixture.java:51)
at fit.Binding$QueryBinding.doCell(Binding.java:215)
at fit.ColumnFixture.doCell(ColumnFixture.java:37)
at fit.Fixture.doCells(Fixture.java:171)
at fit.Fixture.doRow(Fixture.java:165)
at fit.ColumnFixture.doRow(ColumnFixture.java:25)
at fit.Fixture.doRows(Fixture.java:159)
at fit.ColumnFixture.doRows(ColumnFixture.java:18)
at fit.Fixture.doTable(Fixture.java:153)
at fit.Fixture.interpretTables(Fixture.java:99)
at fit.Fixture.doTables(Fixture.java:79)
at fit.FitServer.process(FitServer.java:81)
at fit.FitServer.run(FitServer.java:56)
at fit.FitServer.main(FitServer.java:41)
我不知道它告诉我什么?我写了其他测试方法,如add(), substract()
,一切正常。我想知道这个错误是否涉及在主线程上运行一个长任务?有什么想法吗?
答案 0 :(得分:41)
android.jar
仅包含类的存根实现。它为你的应用程序提供了构建的方法,一旦你拥有你的APK,你必须在Android设备或模拟器上运行它。
如果我没错,你试图在主机的JVM上运行。
答案 1 :(得分:9)
您可以使用Roboelectric轻松解决此问题并在IDE中进行测试。
正如dtmilano所说,你无法在你的笔记本电脑上运行Android代码,但Roboelectric基本上取代了Android.jar中存根的实际方法实现。
如果你选择这个解决方案,需要注意两件事:
如果使用IntelliJ
默认情况下,假设您实际上并不想在某处更改服务器的状态,则会阻止HTTP请求。但是,你可以很容易地禁用它:Roboelectric.getFakeHttpLayer()。interceptHttpRequests(false);
答案 2 :(得分:5)
如前所述,Android jar
对于编译之外的任何事情都不好。即使是大多数无辜的东西也完全被剔除了。但是你仍然可以在具有良好模拟框架的主机VM单元测试中使用它们。我的选择是jmockit
:
不确定它是否适用于Fitnesse
答案 3 :(得分:0)
由于“静态”声明,我遇到了同样的问题。就我而言,.build()在静态变量中引起了问题。一种简单的解决方案是不将变量声明为静态。它可以是最终的。尝试从getJsonArrayFromUrl方法中删除“静态”,看看它是否有效。