• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 解讀Android官方MVP項目單元測試(3)

    發表于:2016-06-29來源:簡書作者:geniusmart點擊數: 標簽:單元測試
    連上設備,跑起UT,會自動啟動相應的Activity界面,做相應的操作后進行測試。 總結:Espresso好強大,而且這一層的測試站在用戶的角度,所有邏輯是黑盒

    連上設備,跑起UT,會自動啟動相應的Activity界面,做相應的操作后進行測試。

    總結:Espresso好強大,而且這一層的測試站在用戶的角度,所有邏輯是黑盒,在功能層面測試輸入(用戶操作)輸出(用戶得到的界面反饋),而技術層面,由于界面是所有層的入口,得到輸出后,除了測試View層本身的邏輯之外,其實已經粗糙的覆蓋了M和P的邏輯了。

    Model層的測試

    關于Model層的測試,首先要了解下該項目中,model層的設計,類層次如下圖所示:


    Model層的類圖
    • TasksLocalDataSource:負責本地數據庫增刪改查操作
    • TasksRemoteDataSource:負責網絡請求(該項目中用handler.postDelayed()延時來模擬網絡請求)
    • TasksRepository:相當于整個Model層的門面,根據邏輯判斷決定數據來自于本地數據庫或是網絡。Presenter層只與它打交道。

    根據以上分析,可見對Model層的測試要完整的覆蓋這三個類。

    1. 我們先看門面TasksRepository的測試,先看看這個類中有關獲取待辦任務列表的流程圖:


      TasksRepository流程圖

      所以對于TasksRepository來講,測試的內容主要是驗證1,2,3的邏輯是否在相應的輸入下覆蓋到位,對于1,2,3的數據準確性無需關心,由各自DataSource去驗證,因此它的測試與Android環境無關,用Junit+Mockito測試。要完整覆蓋的話,需要多個測試case,篇幅有限,這里只講第2種。這個測試類是TasksRepositoryTest,代碼如下:

      @Test
      public void getTasksWithDirtyCache_tasksAreRetrievedFromRemote() {
       //將數據設置為臟數據
       mTasksRepository.refreshTasks();
       //數據為臟數據,因此此時需要從網絡獲取
       mTasksRepository.getTasks(mLoadTasksCallback);
      
       //驗證第2種情況:用TasksRemoteDataSource調用getTasks()獲取數據后返回
       setTasksAvailable(mTasksRemoteDataSource, TASKS);
      
       //驗證第1種情況沒有發生
       verify(mTasksLocalDataSource, never()).getTasks(mLoadTasksCallback);
       //驗證TasksRemoteDataSource執行了回調函數
       verify(mLoadTasksCallback).onTasksLoaded(TASKS);
      }

      其中,setTasksAvailable()代碼如下:

      private void setTasksAvailable(TasksDataSource dataSource, List<Task> tasks) {
       //驗證第2種情況:使用TasksRemoteDataSource調用getTasks()
       verify(dataSource).getTasks(mTasksCallbackCaptor.capture());
       //執行回調 函數
       mTasksCallbackCaptor.getValue().onTasksLoaded(tasks);
      }
    2. 接下來是是TasksLocalDataSource的測試。該測試與數據庫有關,因此依賴于Android環境,且要驗證數據存取的準確性,因此需要做一些斷言,使用AndroidJUnitRunner進行測試,這個類是TasksLocalDataSourceTest,代碼如下:

      @Test
      public void getTasks_retrieveSavedTasks() {
      //事先往DB中插入兩條數據
      final Task newTask1 = new Task(TITLE, "");
      mLocalDataSource.saveTask(newTask1);
      final Task newTask2 = new Task(TITLE, "");
      mLocalDataSource.saveTask(newTask2);
      
       
      
      
      
                 

      原文轉自:http://www.jianshu.com/p/cf446be43ae8

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>