我如何为以下代码android编写单元测试用例?我已经嘲笑了我的restclient(使用改造),但我如何进行单元测试回调?

时间:2015-05-15 16:55:45

标签: java android unit-testing retrofit

RestClient.getInstance().getAllLeads(6, new RestCallback<HashMap<String, Object>>(LeadsHttpAdapter.class) {
        @Override
        public void failure(RestError restError) {

        }

        @Override
        public void restSuccess(Object o) {
            ArrayList<Lead> LeadCardsList = (ArrayList) o;
            LeadsListAdapter leadsListAdapter = new LeadsListAdapter(getActivity(), LeadCardsList);
            LeadsListView.setAdapter(leadsListAdapter);
            LeadsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Intent intent = new Intent(getActivity(), LeadOfferDetails.class);
                    startActivity(intent);
                }
            });
        }
    });

这是在我的活动类函数中编写的,我将RestClient作为参数传递给该函数,因此在单元测试函数时我通过了模拟客户端。我如何测试回调,因为当回调被调用时,我的测试函数超出了范围。

2 个答案:

答案 0 :(得分:0)

我认为您不需要新的测试框架。将restSuccess(Object o)内的代码重构为自己的方法。将新方法放在外部类中。这个新方法很容易在jUnit中测试。经验法则是在任何回调代码中,只需要一行或两行就能保持简单。您不需要测试是否调用restSuccess(Object o)。您可以假设它被调用,仅测试您的代码,而不是框架。

将额外的信用重构onItemClick()添加到自己的类中,并为其编写jUnit测试。

答案 1 :(得分:0)

我会使用Mockito的Mockito.verify()ArgumentCaptor.capture()来触发回调。

如果您不熟悉Mockito并且更喜欢自己存根其余客户端,那么假设您可以将TestRestClient作为参数传递给您要测试的方法:

class TestRestClient extends RestClient {
    public Object response;
    public RestError error;
    public boolean isSuccess;

    @Override
    public getAllLeads(int number, RestCallback<HashMap<String, Object>> callback) {
        if (isSuccess) {
            callback.restSuccess(response);
        } else {
            callback.failure(error);
        }
    }
}

TestRestClient testClient = new TestRestClient();
testClient.isSuccess = true;
testClient.response = <your-response>;
// test your method by passing testClient here

毋庸置疑,TestRestClient应该留在您的测试中。源目录,而不是您的生产代码。但就像我说使用Mockito或等效的模拟框架会更好。