14

Próbuję obecnie przetestować jednostkę testową addonitemclick listener, z junitą lub mockito. oto mój kod:W jaki sposób test jednostkowy (z JUnit lub mockito) pozycja recyclerview klika

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

Czy istnieje sposób mogę jednostka testowa: addOnItemTouchListener lub OnItemClickListener/onitemclick, mock funkcjonalność itd Jestem całkiem nowe do testów jednostkowych i szukaliśmy się online na kilka tutoriali i dość zmieszany. Pomocny mógłby być każdy samouczek krok po kroku służący do testowania funkcji lub dowolne sugestie. Równie przydatne mogłyby być wszelkie inne możliwe do testowania jednostki scenariusze w tej funkcji. Dzięki!

+0

Zdecydowanie nie pomagam, ale myślę, że nie chodzi o test jednostkowy, ale o test interfejsu użytkownika, w którym można użyć [Espresso] (https://developer.android.com/training/testing/ui- testing/espresso-testing.html) – mt0s

+1

@JusticeBauer, spróbuj przeczytać wszystkie komentarze z pozytywnym nastawieniem. Trudno odgadnąć postawę kogoś z kilku słów, a mylne interpretowanie intencji jest łatwe. – njzk2

+0

@Justice Bauer zobacz ten link http: // stackoverflow.com/questions/41033279/moving-a-recyclerview-via-touch-or-gesture-recognition/41122132 # 41122132 Poinformuj mnie o swoich poglądach –

Odpowiedz

6

W testach jednostkowych to improtant mieć małe, sprawdzalne kawałki kodu, chciałbym mają raczej 10 metod z pojedynczą wytłumiennością niż jedna metoda dla wszystkich działań.

Wszystkie użyte dane wejściowe powinny być dostarczone jako parametry do metody, niż do sprawdzenia, czy przy danym wejściu otrzymasz oczekiwany wynik.

Nie testuj tego, czego nie masz - testowanie obiektu onClick() jest częścią zadania AOSP. Możesz przetestować, jak reagujesz na onClickListener.

Przykład:

Więc w ten sposób, jeśli masz sposób jak

goToDetailActivity(Photo photo){...} 

dodać onClickListener w RecyclerAdapter tylko aby zobaczyć pozycjach, które są właściwie wykonane, można sprawdzić na przykład, czy goToDetailActivity (Zdjęcie zdjęciowe).

I w testowaniu można drwić thigs które trzeba (i nie mogą ulec test):

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

Dobry punkt Staring vogella mokcito tutorial.

+0

to tak naprawdę pomogło mi skierować się we właściwym kierunku, dzięki! –

+0

Osiągnąłem to SO z podobnej sytuacji, ale podczas wywoływania 'getChildAt' muszę udawać i zwracać fałszywe' Widok'. Problem z tym jest, gdy wywołujesz 'performClick' ViewHolder, który ma dołączone' OnClickListener' (przynajmniej w moim przypadku), nie otrzymuje kliknięcia, ale robi się z niego wyśmiewany. Więc nie może wykonać kodu w swoim ViewHolder. Tak przynajmniej rozumiem. Może @MarissaNicholas zrobił więcej postępów niż ja. – jonalmeida

+0

Snippet nie jest ważny, naprawię go, gdy będę mieć czas. Powinien być przetestowany jakiś nie szydzony kod. W twoim przykładzie możesz przekazać swoje kliknięcia prezenterowi, który może być zjednoczonym testem –

3

Prawdopodobnie wyodrębniłbym anonimową klasę wewnętrzną, którą tworzysz w addOnItemTouchListener, na osobną klasę.

Następnie zapisałbym odpowiednie testy (jednostkowe) dla metody onItemClick.

To zależy jednak od ogólnego kontekstu aplikacji i od tego, co dokładnie chcesz przetestować.

Dyskusja na temat testów jednostkowych w porównaniu z testami integracyjnymi jest dość kosztowna, a także istnieją pewne niejasności i różne opinie na temat tego, co tak naprawdę jest testem jednostkowym.

Polecam, aby przeczytać więcej na ten temat ze znakomitej serii artykułów Martina Fowlera - np. https://martinfowler.com/bliki/UnitTest.html Jest też inny kawałek o podwójnej testowych w ogóle, które powinny poprowadzić Cię w odniesieniu do tego, czy chcesz używać mocks lub odcinki: https://martinfowler.com/articles/mocksArentStubs.html