2017-07-18 166 views
0

在這裏我得到了演示者代碼示例。如何使在改造調用寫的onSuccess和onFailure處測試單元測試在回調改造

public void getNotifications(final List<HashMap<String,Object>> notifications){ 

     if (!"".equalsIgnoreCase(userDB.getValueFromSqlite("email",1))) { 
      UserNotifications userNotifications = 
        new UserNotifications(userDB.getValueFromSqlite("email",1),Integer.parseInt(userDB.getValueFromSqlite("userId",1).trim())); 
      Call call = apiInterface.getNotifications(userNotifications); 
      call.enqueue(new Callback() { 
       @Override 
       public void onResponse(Call call, Response response) { 
        UserNotifications userNotifications1 = (UserNotifications) response.body(); 


        if(userNotifications1.getNotifications().isEmpty()){ 
         view.setListToAdapter(notifications); 
         onFailure(call,new Throwable()); 
        } 
        else { 
         for (UserNotifications.Datum datum:userNotifications1.getNotifications()) { 
          HashMap<String,Object> singleNotification= new HashMap<>(); 
          singleNotification.put("notification",datum.getNotification()); 
          singleNotification.put("date",datum.getDate()); 
          notifications.add(singleNotification); 
         } 
         view.setListToAdapter(notifications); 
        } 
       } 

       @Override 
       public void onFailure(Call call, Throwable t) { 
        call.cancel(); 
       } 
      }); 
     } 
    } 

} 

我怎樣寫單元測試涵蓋所有情況下,這段代碼。

感謝

回答

4

當你想從服務(API)來測試不同的反應很可能是最好的模擬它,並返回你所需要的。

@Test 
    public void testApiResponse() { 
     ApiInterface mockedApiInterface = Mockito.mock(ApiInterface.class); 
     Call<UserNotifications> mockedCall = Mockito.mock(Call.class); 

     Mockito.when(mockedApiInterface.getNotifications()).thenReturn(mockedCall); 

     Mockito.doAnswer(new Answer() { 
     @Override 
     public Void answer(InvocationOnMock invocation) throws Throwable { 
      Callback<UserNotifications> callback = invocation.getArgumentAt(0, Callback.class); 

      callback.onResponse(mockedCall, Response.success(new UserNotifications())); 
      // or callback.onResponse(mockedCall, Response.error(404. ...); 
      // or callback.onFailure(mockedCall, new IOException()); 

      return null; 
     } 
     }).when(mockedCall).enqueue(any(Callback.class)); 

     // inject mocked ApiInterface to your presenter 
     // and then mock view and verify calls (and eventually use ArgumentCaptor to access call parameters) 
    } 
+0

三江源洙多豬頭...它真的救了我的 – Jay

+0

天你能解釋一下我關於Mockito.doAnswer(東西..) – Jay

+0

您使用符號指定仿製品的行爲。它類似於Mockito.when(mockObject).someMethod(any(Parameter.class))。thenReturn(returnValue);但是這個必須用於沒有(void)返回類型的函數。請參閱https://testing.googleblog.com/2014/03/whenhow-to-use-mockito-answer.html。 –