2017-12-28 18 views
0

테스트 - 저는 RecyclerView 어댑터로 복잡한 의사 결정을 테스트하기 위해 설계된 Espresso 테스트 슈트를 가지고 있습니다.활동이없는 상태에서 Espresso의 RecyclerView를 테스트 할 수 있습니까?

한 번의 테스트에서 RecyclerView를 만들고 테스트중인 어댑터를 전달한 다음 올바른 요소가있는 정확한 수의 자식이 있는지 확인합니다.

문제 - RecyclerView은 결코 그 아이 레이아웃 없기 때문에 나는 다음 코드는 결코 통과 없다는 것을 의미한다 특정 활동없이 고립이 테스트입니다 : 내가 만들 수있는 가정

RecyclerView rv = new RecyclerView(InstrumentationRegistry.getTargetContext()); 
rv.setAdapter(adap); 
assertThat(rv.getChildCount(), is(greaterThan(0))); 

을 이 작업은 RecyclerView를 사용하여 빈 활동과 빈 레이아웃을 작성하지만, 그런 쓰레기 클래스를 작성하지 않으려합니다.

질문 - 이처럼 RecyclerView를 단독으로 작동시킬 수 있습니까? 에스프레소에는 내가 접근 할 수있는 뿌리깊은 모습이 있습니까?

+0

''RecyclerView '에서'measure()'와'layout()'을 직접 호출 해보고 원하는 것을 수행하기에 충분한 지 알아볼 수 있습니다. – CommonsWare

+0

제안 해 주셔서 감사합니다. 나는 실제로'measure (View.MeasureSpec.AT_MOST, View.MeasureSpec.AT_MOST)'와'layout (0,0, rv.getHeight(), rv.getWidth())'를 함께 시도했으나 아무 것도 달성하지 못했다. –

+0

콘크리트 값 (예 : 높이 800, 너비 480)을 사용하면 도움이되지 않을 수 있습니다. 기본 레이아웃 (예 :'LinearLayout')과 함께 작동하지만, 결코 이것을 "RecyclerView"로 시도한 적이 없습니다. RecyclerView는'post()'일 수도 있고, 어떤 작업을 할 수도 있고, 그렇지 않으면 약간의 작업을 요구할 수도 있기 때문에,'measure()'/'layout()'호출과'RecyclerView'를 체크 할 필요가 있습니다. 메인 '루퍼'가 끝나기 전에. 마지막으로, 어댑터를 사용하는'RecyclerView '를 테스트하는 것보다는'RecyclerView.Adapter'를 직접 테스트하는 것만으로도 충분할 것입니다. – CommonsWare

답변

0

CommonsWare으로 표시된 것처럼 RecyclerView가 작업없이 테스트 할 수 있도록하는 방법은 레이아웃을 직접 강제로하는 것입니다.

RecyclerView rv = new RecyclerView(InstrumentationRegistry.getTargetContext()); 
rv.setLayoutManager(new LinearLayoutManager(InstrumentationRegistry.getTargetContext())); 
rv.setAdapter(adapter); 
rv.measure(View.MeasureSpec.AT_MOST, View.MeasureSpec.AT_MOST); 
rv.layout(0,0, 800, 480); //arbitrary sizes 

이 방식으로보기를 생성 한 후, 아이의 수는 더 이상 활동하지 않고 RecyclerView 테스트의 한 가지주의해야 할 점은 당신이 작업을 수행 할 수없는 제로

assertThat(rv.getChildCount(), is(greaterThan(0))); 

수 없습니다. 활동없이

onView(...).perform(click()); 

이 코드는 메시지

찾을 수 없습니다 활동으로 RuntimeException을 발생합니다. getActivity() 또는 startActivitySync 또는 이와 유사한 함수를 호출하여 활동을 시작하는 것을 잊지 않았습니까?