14

В настоящее время я пытаюсь выполнить unit recyclerview addonitemclick listner с помощью junit или mockito. вот мой код:Как выполнить единичный тест (с помощью JUnit или mockito) перехват элемента recyclerview

private void mypicadapter(TreeMap<Integer, List<Photos>> photosMap) { 
    List<PhotoListItem> mItems = new ArrayList<>(); 

    for (Integer albumId : photosMap.keySet()) { 
     ListHeader header = new ListHeader(); 
     header.setAlbumId(albumId); 
     mItems.add(header); 
     for (Photos photo : photosMap.get(albumId)) { 
      mItems.add(photo); 
     } 


     pAdapter = new PhotoViewerListAdapter(MainActivity.this, mItems); 
     mRecyclerView.setAdapter(pAdapter); 
     // set 5 photos per row if List item type --> header , else fill row with header. 
     GridLayoutManager layoutManager = new GridLayoutManager(this, 5); 
     layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
      @Override 
      public int getSpanSize(int position) { 
       if (mRecyclerView.getAdapter().getItemViewType(position) == PhotoListItem.HEADER_TYPE) 
        // return the number of columns so the group header takes a whole row 
        return 5; 
       // normal child item takes up 1 cell 
       return 1; 
      } 
     }); 
     mRecyclerView.setLayoutManager(layoutManager); 
     mRecyclerView.setHasFixedSize(true); 
     mRecyclerView.addOnItemTouchListener(new PhotoItemClickListener(MainActivity.this, 
       new PhotoItemClickListener.OnItemClickListener() { 
        @Override 
        public void onItemClick(View view, int position) { 
         if (pAdapter.getItemViewType(position) == PhotoListItem.HEADER_TYPE) return; 

         Photos photo = pAdapter.getItem(position); 
         Intent intent = new Intent(MainActivity.this, DetailViewActivity.class); 
         intent.putExtra(PHOTO_DETAILS, photo); 
         ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
           MainActivity.this, 

           new Pair<>(view.findViewById(R.id.photoItem), 
             getString(R.string.transition_name_photo)) 
         ); 
         ActivityCompat.startActivity(MainActivity.this, intent, options.toBundle()); 
        } 
       })); 
    } 

Есть ли способ я могу проверить блок: addOnItemTouchListener или OnItemClickListener/onitemclick, издеваться функциональность и т.д. Я довольно новыми для модульного тестирования и смотрел он-лайн на пару учебников и довольно смущенный. Любое пошаговое руководство по тестированию функций или любые предложения помогло бы. Кроме того, были бы полезны любые другие возможные тестируемые сценарии в этой функции. Благодаря!

+0

Определенно, я не помогаю вам, но я думаю, что вы хотите сделать, это не единичный тест, а тест UI, где вы можете использовать [Espresso] (https://developer.android.com/training/testing/ui- testing/espresso-testing.html) – mt0s

+1

@JusticeBauer попробуйте прочитать все комментарии с положительным умом. Трудно угадать отношение кого-то из нескольких слов, а неверное толкование намерения легко. – njzk2

+0

@Justice Bauer см. Эту ссылку http: // stackoverflow.com/questions/41033279/moving-a-recyclerview-via-touch-or-gesture-признание/41122132 # 41122132 Дайте мне знать ваши взгляды –

ответ

6

В единичных тестах это Improtant иметь небольшие, проверяемые куски кода, я бы скорее, имеют 10 методов с единственной resposinbility, чем один метод для всех действий.

Все используемые входы должны поставляться как параметры для метода, чем вы тестируете, если при заданном вводе вы получите ожидаемый выход.

Не проверяйте, что у вас нет - тестирование функции onClick() является частью задания AOSP. Вы можете проверить, как вы реагируете на onClickListener.

Пример:

Так что путь, если у вас есть метод, как

goToDetailActivity(Photo photo){...} 

добавить onClickListener в вашем RecyclerAdapter только для просмотра postions, которые на самом деле фотографии, и вы можете проверить, например, если goToDetailActivity (Фото-фотография).

И в тестировании вы можете издеваться thigs, что вам нужно (и не являются субъектами для проверки):

RecyclerView recyclerView= Mockito.mock(RecyclerView.class); 

List<PhotoListItem> items = new ArrayList<>(); 
Photo photo = Mockitio.mock(Photo.class); 
items.add(photo)); 

PhotoViewerListAdapter adapter = Mockito.mock(PhotoViewerListAdapter); 

adapter.setData(items); 
recycleView.setAdapter(adapter); 

// simulate first item was clicked 
recyclerView.getChildAt(0).performClick(); 


//Check if method was invoked with our object 
Mockito.verify(adapter).goToDetailActivity(photo); 

Хорошая точка смотрящая vogella mokcito tutorial.

+0

Это действительно помогло мне направиться в правильном направлении, спасибо! –

+0

Я достиг этого SO из аналогичной ситуации, но при вызове 'getChildAt' я должен высмеивать и возвращать макет' View'. Проблема с этим заключается в том, что при вызове 'performClick' ViewHolder, у которого есть« OnClickListener », прикрепленный (по крайней мере, в моем случае), не получает щелчок, но это издевается. Поэтому он не может выполнить код в вашем ViewHolder. По крайней мере, это мое понимание. Возможно, @MarissaNicholas добился большего прогресса, чем я. – jonalmeida

+0

Фрагмент недействителен, я исправлю его, когда у меня будет время. Поэтому должен быть некоторый проверенный не издевавшийся код. В вашем примере вы можете передать свои клики ведущему, которые могут быть объединены в тесте –

3

Возможно, я извлечу анонимный внутренний класс, который вы создаете в addOnItemTouchListener, в отдельный класс.

Затем я напишу соответствующие (единичные) тесты для метода onItemClick.

Это в значительной степени зависит от общего контекста вашего приложения и от того, что именно вы хотите проверить.

Обсуждение тестов модульных тестов и интеграции довольно дорогое, и есть также некоторые путаницы и разные мнения вокруг того, что действительно является модульным тестом.

Я бы порекомендовал начать читать дальше по теме из превосходной серии статей Мартина Фаулера - например, https://martinfowler.com/bliki/UnitTest.html Там также другая часть о тестируемых удваивается в целом, которые должны направлять вас в отношении хотите ли вы использовать издевается или корешки: https://martinfowler.com/articles/mocksArentStubs.html

 Смежные вопросы

  • Нет связанных вопросов^_^