使用Mockito-Make Mock对抽象,空隙方法进行单位测试



我正在尝试 mvp tdd。

我有以下模型,查看和演示者

的合同

合同类

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);
    }
}

我的 oilotview / view 类看起来像这样:

这是 ->模拟类

class MockView implements GithubContract.View {
        boolean enoughItems = false;
        @Override
        public void displayUsers(List<GurkhaComboDTO> userList) {
            enoughItems = true;
        }
}

我的主持人合同的实现就是这样..

这是 ->真实类

    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);
                }     
   }

    }

我有模型类似的类实现:

这是 ->真实类

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自己的模型来测试了主持人,但是我想使用摩擦图来模拟模型,但是由于我的 getUsersand and promptpresenter()方法是抽象的,返回void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void becture void void void void void从方法内的内部类中获取参数并回电给主持人。

我该如何模拟我的模型?如果我需要进行一些修改以使其能够进行测试,请建议您。

您不应将演示者传递给模型,模型和演示者,因为它可以防止模型类可重复使用。而是提供成功和错误回调(或包含这两个回调的复合对象)。然后,您将能够用Mockito捕获该回调,并致电所需的回调。同样,今天使用rxjava非常普遍,它使模型类更容易。
这是一个普遍的良好做法:您应该避免使用和/或方法名称中的单词,因为它表明该方法正在做不超过一件事,而这是不好的

相关内容

  • 没有找到相关文章

最新更新