14

Tôi hiện đang cố gắng kiểm tra đơn vị recyclerview addonitemclick listner, với junit hoặc mockito. đây là mã của tôi:Làm cách nào để kiểm tra đơn vị (với JUnit hoặc mockito) recyclerview nhấp chuột vào mục

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

Có cách nào tôi có thể kiểm tra đơn vị: addOnItemTouchListener hoặc OnItemClickListener/onitemclick, thử các chức năng vv Tôi khá mới để kiểm tra đơn vị và được nhìn lên trực tuyến tại một vài hướng dẫn và khá bối rối. Bất kỳ hướng dẫn từng bước cho các chức năng kiểm tra hoặc bất kỳ đề xuất sẽ giúp. Ngoài ra, bất kỳ đơn vị có thể testable kịch bản khác trong chức năng này sẽ hữu ích. Cảm ơn!

+0

Chắc chắn tôi không giúp bạn nhưng tôi nghĩ rằng những gì bạn muốn làm không phải là bài kiểm tra đơn vị mà là bài kiểm tra giao diện người dùng nơi bạn có thể sử dụng [Espresso] (https://developer.android.com/training/testing/ui- testing/espresso-testing.html) – mt0s

+1

@JusticeBauer hãy cố gắng đọc tất cả các bình luận với một bộ óc tích cực. Thật khó để đoán thái độ của một người nào đó từ một vài từ, và hiểu sai ý định là dễ dàng. – njzk2

+0

@Justice Bauer thấy liên kết này http: // stackoverflow.com/questions/41033279/moving-a-recyclerview-via-touch-hoặc-gesture-recognition/41122132 # 41122132 Hãy cho tôi biết quan điểm của bạn –

Trả lời

6

Trong các thử nghiệm đơn vị đó là improtant có, khối kiểm chứng nhỏ của mã, tôi sẽ thay vì có 10 phương pháp có độ hồi quy đơn so với một phương pháp cho tất cả các hành động.

Tất cả các đầu vào được sử dụng phải được phân phối dưới dạng tham số cho phương thức, so với kiểm tra nếu ở đầu vào cho sẵn, bạn sẽ nhận được kết quả mong đợi.

Đừng kiểm tra những gì bạn không sở hữu - kiểm tra onClick() của Chế độ xem là một phần của công việc AOSP. Bạn có thể kiểm tra cách bạn phản ứng với onClickListener.

Ví dụ:

Vì vậy, theo cách đó nếu bạn có phương pháp như

goToDetailActivity(Photo photo){...} 

thêm OnClickListener trong RecyclerAdapter của bạn chỉ để xem postions mà thực sự là hình ảnh, và bạn có thể kiểm tra ví dụ nếu goToDetailActivity (Ảnh ảnh) đã được gọi.

Và trong thử nghiệm, bạn có thể thử thigs mà bạn cần (và không phải là đối tượng để kiểm tra):

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

Tốt nhìn chằm chằm điểm vogella mokcito tutorial.

+0

điều này thực sự đã giúp tôi chỉ đạo đúng hướng, cảm ơn! –

+0

Tôi đã đạt được SO này từ một tình huống tương tự, nhưng khi gọi 'getChildAt' tôi phải giả lập và trả về một mô hình' Xem'. Vấn đề với điều này là, khi bạn gọi 'performClick' ViewHolder, trong đó có một' OnClickListener' đính kèm (trong trường hợp của tôi ít nhất), không nhận được nhấp chuột, nhưng người được chế nhạo làm. Vì vậy, nó không thể thực thi mã trong ViewHolder của bạn. Đây là sự hiểu biết của tôi ít nhất. Có thể @MarissaNicholas đã có nhiều tiến bộ hơn tôi. – jonalmeida

+0

Đoạn mã không hợp lệ, tôi sẽ sửa lỗi khi có thời gian. Vì vậy, cần có một số mã không được thử nghiệm. Trong ví dụ của bạn, bạn có thể chuyển các nhấp chuột của bạn đến người trình bày có thể là các thử nghiệm hợp nhất –

3

Tôi có thể trích xuất lớp bên trong ẩn danh bạn đang tạo trong addOnItemTouchListener vào một lớp riêng biệt.

Sau đó, tôi sẽ viết các bài kiểm tra (đơn vị) có liên quan cho phương pháp onItemClick.

Điều này phụ thuộc rất nhiều vào bối cảnh tổng thể của ứng dụng của bạn và chính xác bạn muốn thử nghiệm điều gì.

Cuộc thảo luận về kiểm tra đơn vị so với thử nghiệm tích hợp khá tốn kém và cũng có một số nhầm lẫn và ý kiến ​​khác nhau về thử nghiệm đơn vị thực sự là gì.

Tôi khuyên bạn nên bắt đầu đọc thêm về chủ đề từ loạt bài viết tuyệt vời của Martin Fowler - ví dụ: https://martinfowler.com/bliki/UnitTest.html Ngoài ra còn có một mảnh về đôi kiểm tra nói chung, mà nên hướng dẫn bạn liên quan đến việc bạn muốn được sử dụng mocks hay cùi: https://martinfowler.com/articles/mocksArentStubs.html

Các vấn đề liên quan