2017-03-13 8 views
0

私は試していますMVPパターンはTDDです。モチトを使った単体テスト - 抽象的なモックを作る、voidメソッド

私はユニットテストにこのようなプレゼンターロジックしようとしています表示し、プレゼンター

契約クラス

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

マイPRESENTER実装はこのようなものです。 。

これがある - 私はこのようなMODELクラスの実装持って>実際のクラス

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のモックで自分自身をテストすることに成功しましたが、私はモデルをモックするためにMockitoを使用したいと思いますが、getUsersAndPromptPresenter()メソッドは抽象メソッドであり、voidを返し、パラメータを取得し、メソッド内のInnerクラス

モデルを模擬するにはどうすればよいですか?テスト可能にするためにアーキテクチャーを変更する必要がある場合は、それを提案してください。

答えて

2

プレゼンターをモデルに渡すべきではありません。モデルとプレゼンターは、モデルクラスを再利用できないようにしっかりと結合しないでください。代わりに、成功したコールバックとエラーコールバック(またはこれらのコールバックを両方含むコンポジットオブジェクト)を提供してください。そして、あなたはmockitoでそのコールバックを捕捉し、必要なものを呼び出すことができます。 RxJavaを使用することは今日でも非常に一般的です.Modelクラスを模擬する方が簡単です。
一般的な良い習慣は以下のとおりです。メソッド名にAndとOrを使用することは避けてください。メソッドが2つ以上悪いことを示しているからです。

関連する問題