2020年5月7日木曜日

mockito-kotlin で lambda を mock + @RunWith(AndroidJUnit4::class) のときは work around が必要

以下のような @RunWith(AndroidJUnit4::class) を使わない Unit Test は問題なく動くのですが、
  1. class HogeTest {  
  2.   
  3.     @Test  
  4.     fun test() {  
  5.         val listener = mock<(Boolean) -> Unit>()  
  6.   
  7.         ...  
  8.   
  9.         verify(listener)(false)  
  10.     }  
  11. }  
次のように @RunWith(AndroidJUnit4::class) をつけるとエラーが発生します。
  1. @RunWith(AndroidJUnit4::class)  
  2. class HogeTest {  
  3.   
  4.     @Test  
  5.     fun test() {  
  6.         val listener = mock<(Boolean) -> Unit>()  
  7.   
  8.         ...  
  9.   
  10.         verify(listener)(false)  
  11.     }  
  12. }  

org.mockito.exceptions.base.MockitoException:
ClassCastException occurred while creating the mockito mock :
class to mock : 'kotlin.jvm.functions.Function1', loaded by classloader : 'sun.misc.Launcher$AppClassLoader@18b4aac2'
created class : 'kotlin.jvm.functions.Function1$MockitoMock$1350680399', loaded by classloader : 'net.bytebuddy.dynamic.loading.MultipleParentClassLoader@7a2a2c83'
proxy instance class : 'kotlin.jvm.functions.Function1$MockitoMock$1350680399', loaded by classloader : 'net.bytebuddy.dynamic.loading.MultipleParentClassLoader@7a2a2c83'
instance creation by : ObjenesisInstantiator


この場合クッションになる interface を定義すると動きます。
  1. @RunWith(AndroidJUnit4::class)  
  2. class HogeTest {  
  3.   
  4.     private interface Callback : (Boolean) -> Unit  
  5.   
  6.     @Test  
  7.     fun test() {  
  8.         val listener = mock<Callback>()  
  9.   
  10.         ...  
  11.   
  12.         verify(listener)(false)  
  13.     }  
  14. }  


参考 : https://github.com/nhaarman/mockito-kotlin/issues/272



0 件のコメント:

コメントを投稿