2019年2月20日水曜日

Intent の equals 判定には filterEquals() を使う

  1. val intent1 = Intent(Intent.ACTION_VIEW)  
  2. val intent2 = Intent(Intent.ACTION_VIEW)  
これに対し
  1. assertThat(intent1).isEqualTo(intent2) // fail  
は失敗します。Intent で equals() は override されていません。

では Intent の比較はどうするかというと filterEquals() を使います
  1. assertThat(intent1.filterEquals(intent2)).isTrue() // success  
Intent の構成をチェックしたいだけなら IntentSubject を使うという方法もあります。
  1. IntentSubject.assertThat(intent1).hasAction(Intent.ACTION_VIEW) // success  



  1. class Navigator(private val context: Context) {  
  2.   
  3.     fun moveTo() {  
  4.         context.startActivity(  
  5.             Intent(  
  6.                 Intent.ACTION_VIEW,  
  7.                 Uri.parse("https://developer.android.com/")  
  8.             )  
  9.         )  
  10.     }  
  11. }  
このクラスに対して context.startActivity() の呼び出しをチェックする以下のテストは失敗します。Intent の equals() が false になるからです。
  1. val context = mock(Context::class.java)  
  2.   
  3. Navigator(context).moveTo()  
  4.   
  5. // fail  
  6. verify(context).startActivity(  
  7.     Intent(  
  8.         Intent.ACTION_VIEW,  
  9.         Uri.parse("https://developer.android.com/")  
  10.     )  
  11. )  
argThat を使って filterEquals() を使えば成功します。
  1. val context = mock(Context::class.java)  
  2.   
  3. Navigator(context).moveTo()  
  4.   
  5. // success  
  6. verify(context).startActivity(argThat { intent ->  
  7.     intent.filterEquals(  
  8.         Intent(  
  9.             Intent.ACTION_VIEW,  
  10.             Uri.parse("https://developer.android.com/")  
  11.         )  
  12.     )  
  13. })  



0 件のコメント:

コメントを投稿