【发布时间】:2016-01-26 10:26:38
【问题描述】:
我一直在开发 Android 应用程序,但没有编写任何单元测试。最近我开始学习它并尝试使用 JUnit 来测试我的 android 应用程序。
我发现大多数时候我都会在 API 调用中遇到错误,但我仍然无法理解如何为它们编写单元测试(以及如何使原始代码可测试)。
让我解释一下下面的函数:
我正在运行一个函数调用 setOffenceList()。函数内部发生了多个动作。
i) 加载 RestClient 并传递 URL。
ii) RestClient 与 JSON api 对话并获得响应
ii) 我在 onSuccess(String response) 函数中获取响应
iii) 解析 JSON 数据并存储在数组中
iv) 如果成功,我将在列表视图中显示数据(否则显示错误消息)
这是代码:
public class OffenceFrag extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frag_offence, container, false);
//run API call
setOffenceList();
return view;
}
private void setOffenceList() {
String url = Paths.SITE_URL ;
RestClient.get(url, null, new AsyncHttpResponseHandler() {
@Override
public void onStart() {
Toast.makeText(getActivity(), "Loading offences...", Toast.LENGTH_SHORT).show();
}
@Override
public void onSuccess(String response) {
//Parse JSON
JSONArray jsonArray;
try {
JSONObject jsonObj = new JSONObject(response);
if(jsonObj.getString("status").equalsIgnoreCase("Success")){
jsonArray = new JSONArray(jsonObj.getString("data"));
if(jsonArray.length() > 0){
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject row = jsonArray.getJSONObject(i);
OffenceORM off = new OffenceORM();
off.setOffenceId(row.getString("offence_id"));
off.setPhoto(row.getString("photo"));
off.setSubmittedBy(row.getString("submitted_by"));
offenceList.add(off);
}
}
//Success: Show the list view
setOffenceAdapter();
Toast.makeText(getActivity(), "Successfully Loaded", Toast.LENGTH_LONG).show();
} else {
//Failed: show error message
Toast.makeText(getActivity(), "There are no offences submitted under project", Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Log.e("exception", e.getMessage());
}
}
@Override
public void onFailure(Throwable error, String content) {
Log.e("failed", error.getMessage());
}
@Override
public void onFinish() {
}
});
}
}//end
我真的不明白如何为上述代码编写测试函数。
您能告诉我如何将这段代码分解为可测试的部分并为它们编写单元测试函数吗?
非常感谢!
【问题讨论】:
-
一种方法是编写一个集成测试来练习 REST API。见stackoverflow.com/questions/10752/…。在单元测试方法中,您通常会模拟
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState,将它们传递给OffenceFrag. onCreateView()并断言 OffenceFrag 符合您的预期
标签: java android api unit-testing junit