fresh digitable

めんどくさかったなってことを振り返ったり振り返らなかったりするための記録

RobolectricでRecyclerView.smoothScrollToPosition()を呼ぶとテストが進まなくなる(未解決)

ViewPagerの代わりにRecyclerViewを使ってチュートリアルの紙芝居を実装したのだが、進むボタンをN回押してサインアップへ進む画面に行くテストがいつまで経っても終了しない現象が起きた。諸事情によりprintデバッグを使って二分探索的にどこで止まっているかを調べたところ、どうもDatabindingでRecyclerView.smoothScrollToPosition()を呼んでいるところが怪しいということになりぐぐった結果、次のissueを発見した。

github.com

私の環境ではRobolectricは4.0.2だが、issueが出たのがだいたい1年前で、他の人が4.1-SNAPSHOTでも起きていると言っているので根が深そう。EspressoのswipeLeft()を使ってみたがこれもハングした。しかし、RecyclerViewActions.scrollToPosition()を使うとページを送ってやることはできた。ただ、この方法ではスクロール位置がコールバックに渡って来ないので、「ページ番号が変わっているか」みたいなことはチェックできないかもしれない。

結局、いい回避策が思いつかなかったので棚上げしてしまった。アニメーションが絡むとなんかうまくいかないのかなとか、スクロールした量(xとかy方向の移動量)を計算できないのかなとかいろいろ想像してみるけど全然わからない。知っている人がいたら教えて欲しい。できれば直してくれるとありがたい。

以下は本件とは関係ないけどいい本なのでみなさん買ってください。

peaks.cc

peaks.cc