java - 安卓单元测试 : How to make a class more testable?

标签 java android api unit-testing junit

我一直在开发 android 应用程序,但没有编写任何单元测试。最近我开始了解它并尝试使用 JUnit 来测试我的 android 应用程序。

我发现大多数时候我在 API 调用中遇到错误,但我仍然不明白如何为它们编写单元测试(以及如何使原始代码可测试)。

下面我来解释一下函数:

我正在运行一个函数调用 setOffenceList()。函数内部发生了多个 Action 。

i) 加载 RestClient 并传递 URL。

ii) RestClient 与 JSON api 对话并获得响应

ii) 我在 onSuccess(String response) 函数中获取响应

iii) 解析 JSON 数据并存储在数组中

iv) 如果成功,我将在 ListView 中显示数据(否则显示错误消息)

这是代码:

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

我真的无法理解如何为上面的代码编写测试函数。

你能告诉我如何将这段代码分解成可测试的部分并为它们编写单元测试函数吗?

非常感谢!

最佳答案

只有好的设计才能帮助您简化单元测试。这就是测试驱动开发存在的原因。这样您就不会选择错误的设计。

当您进行单元测试时,您只需测试您编写的代码并使用 Android 提供的模拟对象来测试 android Api 调用。

就其他 Api 的问题而言,这是 Api 开发人员的问题,而不是您的问题。您可以使用 Mockito 等模拟框架在调用其他 API 代码时测试代码的功能。如果您正在开发自己的 API,请单独测试 API 代码。

好的设计必须遵循设计原则

  • S – 单一职责原则
  • O – 开闭原则
  • L – 里氏替换原则
  • I – 接口(interface)隔离原则
  • D – 依赖倒置原则

要点:

  • 每个单元测试用例调用一次断言方法
  • 不要仅仅为了测试而修改类。
  • 接口(interface)的使用
  • 不要在一个方法中放置太多语句或功能。
  • 不要开设太大的类(class)。
  • 使用 TDD......更多

对设计糟糕的代码进行单元测试完全是浪费。因为每次您对类进行一些更改时测试都会中断。在 Android 中,这种情况会发生得更多。当您受困于 Android 生命周期方法时。

仔细抽象出您想在自己的类中测试的功能。

这将使您的应用程序代码更加健壮、简单和清晰。

关于java - 安卓单元测试 : How to make a class more testable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35011666/

相关文章:

android - Facebook 式的弹出式操作方法?

c# - ASP.NET Web api 上的文件上传端点损坏文件

PHP Google Analytics API - 简单示例

android - 三星 Galaxy SIII 的相机是否存在缺陷?

java - 通过 USB 连接和调试, Activity 无法启动

java api REST 客户端出现 POST 错误 : no suitable HttpMessageConverter

java - 如何使用 Gradle 启用 Java 12 预览功能?

java - 使用 Java EJB 和 JAX-RS 以及 Server Faces 的员工应用程序

java - Spring MVC - 是否可以通过 GET 接收强类型请求对象?

java - 意外的 mongodb 更新被阻止