2017-03-13 107 views
0

我正在尝试MVP模式与TDD。使用Mockito进行单元测试 - 使抽象模拟虚拟方法

我为模型,视图和演示

合同类具有以下合同

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类看起来是这样的:

这是 - >模拟类

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


    } 

我有MODEL类实现这样的:

这是 - >房地产类

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,将参数和调用返回给演示者方法内部的一个内部类。

我该如何嘲笑我的模特?如果我需要在体系结构上进行一些更改以便能够进行测试,那么请提出建议。

回答

2

您不应该将演示者传递给Model,Model和Presenter不应该紧密耦合,因为它可以防止模型类被重用。而应提供成功和错误回调(或包含这两个回调的复合对象)。然后你将能够用mockito捕捉回调并调用所需的回调。今天使用RxJava也很常见,它可以更容易地模拟Model类。
这里是一个很好的实践:你应该避免在方法名中使用和/或单词,因为它表示该方法做的不止一件事是坏的