2017-03-13 36 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類。
這裏是一個很好的實踐:你應該避免在方法名中使用和/或單詞,因爲它表示該方法做的不止一件事是壞的