Part II — Understanding about RuleChain

Dani Diprana
Karena Kita Vidio
Published in
3 min readNov 25, 2019

Introduction

Tulisan kali ini adalah lanjutan dari Part I — Why we need TestRule and how it works ?? ..

Dalam satu test class, kita dapat membuat lebih dari satu @get:Rule, seperti contoh dibawah ini:

Berdasarkan cara kerja TestRule yang sudah dijelaskan Part I — Why we need TestRule and how it works ?? . Jika terdapat lebih dari satu anotasi @get:Rule maka mana yang akan dieksekusi terlebih dahulu ?

If there are multiple annotated {@get:Rule }s on a class, they will be applied in order of fields first, then methods.
However, if there are multiple fields (or methods) they will be applied in an order that depends on your JVM's implementation of the reflection API, which is undefined, in general.

Jadi, bagaimana jika kita membutuhkan lebih dari satu TestRule dan kita mempunyai kebutuhan untuk menjaga urutan proses eksekusi dari TestRule yang telah kita buat ?? Jawabannya adalah dengan menggunakan RuleChain..!!

What is RuleChain

RuleChain memiliki kemampuan untuk mengeksekusi TestRule sesuai dengan urutan yang kita inginkan. Untuk membuat RuleChain, kita perlu menambahkan outerRule(TestRule) dan dapat diikuti oleh pemanggilan method around(TestRule) sesuai kebutuhan.

@get:Rule
val rule = RuleChain.outerRule(testRuleLangit)
.around(testRuleDaratan)
.around(testRuleLautan)
  • outerRule(TestRule) adalah sebuah method yang mengembalikan nilai RuleChain dengan satu TestRule. Method ini adalah starting point of the RuleChain. Jadi, TestRule yang dilalukan kedalam method ini adalah TestRule yang akan pertama kali dieksekusi.
  • around(TestRule) adalah sebuah method yang akan membuat RuleChain baru. TestRule yang dilalukan kedalam method ini akan disambungkan dengan TestRule yang sudah ada. Jadi, TestRule yang dilalukan kedalam method ini akan dieksekusi setelah TestRule sebelumnya.
  • Jadi, berdasarkan potongan sample code diatas. TestRule yang akan dijalankan pertama kali adalah testRuleLangit lalu dilanjutkan oleh testRuleDaratan dan dilanjutkan dengan testRuleLautan.

So, how it works ?

Kurang lebih, RuleChain akan bekerja seperti dibawah ini :

  1. Didalam RuleChain, terdapat sebuah list dari testRule dan mempunyai nilai awal yaitu emptyList().
  2. TestRule yang dimasukan kedalam outerRule akan menjadi TestRule yang pertama akan dieksekusi karena TestRule tersebut menjadi value dari list TestRule yang terdapat didalam RuleChain.
  3. Dengan memasukan TestRule menggunakan method around maka akan ditambahkan dengan list TestRule yang sudah ada.
  4. Jadi, jika berdasarkan contoh diatas. Maka akan diperoleh RuleChain seperti ini .. listOf(testRuleLangit, testRuleDaratan, testRuleLautan).
  5. List dari TestRule tersebut akan disimpan didalam rulesStartingWithInnerMost.
  6. Pada saat apply method dari RuleChain dijalankan maka semua testRule yang ada didalam rulesStartingWithInnerMost akan diulang dan melakukan pemanggilan secara rekursif kepada apply method yang ada pada TestRule selanjutnya yang terdapat didalam rulesStartingWithInnerMost.
  7. Jadi, yang akan dijalankan adalah dari paling luar dan diteruskan oleh testRule yang lebih dalam sampai kepada test nya. Jika digambarkan seperti dibawah ini :
RuleChain Example

Untuk cara membuat testRule bisa cek kembali ke Part I dari artikel ini ya..

Jika gambar diatas dieksekusi maka outputnya akan seperti dibawah ini

Before evaluate on TestRuleLangit
Before evaluate on TestRuleDaratan
Before evaluate on TestRuleLautan
Test executed
TestRuleLautan Finish
TestRuleDaratan Finish
TestRuleLangit finish

Jadi, mudah bukan cara menggunakan RuleChain ? Dengan kita mengatur urutan dari testRule yang akan dieksekusi, kita dapat memastikan test yang akan dieksekusi memiliki persiapan yang benar.

Berikut adalah contoh penggunaan dari RuleChain yang sering saya lakukan :

  1. Jika kita memiliki sebuah property yang disiapkan menggunakan dependency injection maka kita harus memastikan property tersebut sudah memiliki nilai sebelum activity ditampilkan.
  2. Jika kita ingin mengulang sebuah test sebanyak n , dan kita memerlukan sebuah IntentTestRule maka kita dapat menyambungkan kedua rule tersebut menjadi RuleChain.outerRule(RepeatTestRule()).around(IntentTestRule).

Gimana nihhh artikelnya ?? Cukup membantu untuk memahami RuleChain kannn … ayo berikan claps untuk support dan tinggalkan komentar untuk berdiskusi. Semoga bermanfaat ya guys =D

Bonus nihh guys .. buat contoh dari RepeatTestRule dan RuleChainExample bisa cek di github ya

--

--