使用Mockito进行单元测试 - 模拟Abstract,void方法

时间:2017-03-13 10:58:09

标签: android mockito retrofit2 mvp android-testing

我正在尝试使用 TDD MVP 模式。

我有模型,视图和演示者

的以下合同

合同类

interface GithubContract {
    interface View {
        void displayUsers(List<GurkhaComboDTO> userList);
    }

    interface Model {
        void getUsersAndPromptPresenter(String userName, Presenter presenter);

    }

    interface Presenter {

        void searchUsers(String userName);

        void loadUsers(List<GithubUserDTO> userList);
    }
}

我正在尝试对演示者逻辑进行单元测试:

测试类

@RunWith(MockitoJUnitRunner.class)
public class GithubPresenterWithMockitoTest {

    @Mock
    GithubContract.Model mockedModel;

    @Test
    public void shouldDisplayUsersToScreen() {
        //given
        final GithubContract.View view = new MockView(); // I have created the mock myself for the view this time.
        final GithubContract.Presenter presenter = new GithubPresenter(view, mockedModel);
        ***********************************************************
        // I do not know what to write here 
        ****************************************************
        presenter.searchUsers("");
        Assert.assertEquals(true, ((MockView) (view)).enoughItems);
    }
}

我的 MockView / VIEW 类看起来像这样:

这是 - &gt;模拟课

class MockView implements GithubContract.View {
        boolean enoughItems = false;

        @Override
        public void displayUsers(List<GurkhaComboDTO> userList) {
            enoughItems = true;
        }
}

我的 PRESENTER 合同执行情况就是这样..

这是 - &gt;真实班级

    class GithubPresenter implements GithubContract.Presenter {

            private GithubContract.View view;
            private GithubContract.Model model;

        GithubPresenter(GithubContract.View view, GithubContract.Model model) {

                this.view = view;
                this.model = model;
            }

        @Override
        public void searchUsers(String userName) {
            model.getUsersAndPromptPresenter(userName, this);
        }

        @Override
        public void loadUsers(List<GithubUserDTO> data) {

            if (data != null) { 
                if (!data.isEmpty()) {
                    view.displayUsers(users);
                }     
   }


    }

我有 MODEL 类实现,如下所示:

这是 - &gt;真实班级

public class GithubModel implements Model {

    @Inject
    GithubAPIService apiService;
    private Call<GithubUserListDTO> userListCall;

    private Context context;

    GithubModel(Context context) {
        this.context = context;
        apiService = Util.getAPIService(); // I am using dagger, retrofit and okhttp3 with GSON to get Objects directly from network call 

    }

    @Override
    public void getUsersAndPromptPresenter(final String userName, final GithubContract.Presenter presenter) {
        userListCall = apiService.searchGitHubUsers(userName);
        if(Util.isInternetConnected(context)) {
            userListCall.enqueue(new Callback<GithubUserListDTO>() {
                @Override
                public void onResponse(Call<GithubUserListDTO> call, Response<GithubUserListDTO> response) {

                    try {
                        presenter.loadUsers(response.body().getList());
                    } catch (Exception ignored) {
                        Util.log(ignored.getMessage());

                    }

                }

                @Override
                public void onFailure(Call<GithubUserListDTO> call, Throwable t) {

                }
            });
        }else {
Util.log("No Internet");
        }
    }
}

现在真正的问题部分:

我成功地能够使用GithubContract.Model模拟测试演示者,但是我想使用Mockito来模拟模型但是因为我的 getUsersAndPromptPresenter()方法是抽象的,所以返回void,从方法内的Inner类获取参数并调用presenter。

我如何模拟我的模型?如果我需要对架构进行一些更改以便能够使其可测试,那么请提出建议。

1 个答案:

答案 0 :(得分:2)

您不应该将演示者传递给Model,Model和Presenter不应该紧密耦合,因为它会阻止模型类重用。而是提供成功和错误回调(或包含这两个回调的复合对象)。然后,您将能够使用mockito捕获该回调并调用所需的回调。今天使用RxJava也很常见,它可以更容易地模拟Model类 这是一个通用的好习惯:你应该避免在方法名称中使用And / Or单词,因为它表明该方法不仅仅是一个不好的东西