首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Mockito的单元测试--嘲笑抽象的、无效的方法

使用Mockito的单元测试--嘲笑抽象的、无效的方法
EN

Stack Overflow用户
提问于 2017-03-13 10:58:08
回答 1查看 371关注 0票数 0

我正在尝试MVP模式和TDD.

我有以下模型、视图和演示者的合同

合同类

代码语言:javascript
复制
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);
    }
}

我试图像这样对演示者逻辑进行单元测试:

测试类

代码语言:javascript
复制
@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 /视图类如下所示:

,这是->模拟类

代码语言:javascript
复制
class MockView implements GithubContract.View {
        boolean enoughItems = false;

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

我的演示者合同的实现是这样的。

这是->实类

代码语言:javascript
复制
    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);
                }     
   }


    }

我有这样的模型类实现:

这是->实类

代码语言:javascript
复制
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来模拟这个模型,但是由于我的GithubContract.Model方法是抽象的,所以返回了void,接受参数并从方法中的一个内部类调用演示者。

我怎么能嘲笑我的模特?如果我需要对架构进行一些修改,以使其能够测试,那么请提出建议。

EN

回答 1

Stack Overflow用户

发布于 2017-03-14 16:28:11

不应该将演示程序传递给Model,Model和presenter不应该紧密耦合,因为它阻止了模型类的可重用性。相反,提供完整的和错误的回调(或者包含这两个回调的复合对象)。然后您就可以用mockito捕获回调,并调用所需的回调。而且,现在使用RxJava非常普遍,它使模拟模型类变得更容易。

下面是一个一般的好做法:您应该避免在方法名称中使用和/或单词,因为它表明该方法正在做不止一件错误的事情。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42761910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档