kotlin中的嘲讽伴侣对象函数

问题描述:

我正在使用PowerMock和Roboelectric,并且想嘲笑类的伴侣对象函数。当我这样做,我得到一个错误:kotlin中的嘲讽伴侣对象函数

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'. 
For example: 
    when(mock.getArticles()).thenReturn(articles); 

我也基本是这样的:

open class MockableClass private constructor(context: Context) { 

    companion object { 

     private val INSTANCE_LOCK = Any() 
     private var sInstance: MockableClass? = null 

     @JvmStatic 
     fun getInstance(context: Context): MockableClass? { 
      synchronized(INSTANCE_LOCK) { 
       sInstance = (sInstance ?: MockableClass(context).let { 
        if (it.isValid) it 
        else null 
       } 
      } 
      return sInstance 
     } 
    } 

    init { 
     // Do some initialization using context... 
     // Set isValid to true/false depending on success 
    } 

    val isValid: Boolean 
} 

当我去考这个,我会以为它会一直工作,并希望有的getInstance刚返回MockableClass的模拟版本。

@RunWith(RobolectricTestRunner::class) 
@Config(manifest = "src/main/AndroidManifest.xml", 
     constants = BuildConfig::class, 
     sdk = intArrayOf(23)) 
@PowerMockIgnore("org.mockito.*", "org.robolectric.*", "android.*") 
@PrepareForTest(MockableClass::class) 
class MyTest { 

    private lateinit var context: Context 

    @get:Rule 
    val rule = PowerMockRule() 

    @Before 
    fun setUp() { 
     context = RuntimeEnvironment.application as Context 
    } 

    @Test 
    fun test() { 
     val instance = mock(MockableClass::class.java) 
     mockStatic(MockableClass::class.java) 
     `when`(MockableClass.getInstance(Matchers.isA(Context::class.java))) 
       .thenReturn(instance) 
     assertEquals(instance, 
       MockableClass.getInstance(RuntimeEnvironment.application as Context)) 
    } 
} 

我也试过嘲笑MockableClass.Companion :: class.java没有运气。

有没有人知道我需要做什么才能模拟出getInstance函数?

+0

我会删除Robolectric标签,因为它只是关于Kotlin和反射的问题。 –

+0

够公平的,我不确定班加载器是否与它有关。 – TheHebrewHammer

我最终什么事做......

而不是嘲笑我结束了使用PowerMockito的whenNew函数返回的MockableClass一个嘲笑实例的静态方法。最终代码如下所示:

@RunWith(RobolectricTestRunner::class) 
@Config(manifest = "src/main/AndroidManifest.xml", 
     constants = BuildConfig::class, 
     sdk = intArrayOf(23)) 
@PowerMockIgnore("org.mockito.*", "org.robolectric.*", "android.*") 
@PrepareForTest(MockableClass::class) 
class MyTest { 

    private lateinit var context: Context 

    @JvmField 
    @Rule 
    var rule = PowerMockRule() 

    @Before 
    fun setUp() { 
     context = RuntimeEnvironment.application as Context 
    } 

    @Test 
    fun test() { 
     val instance = mock(MockableClass::class.java) 
     instance.isValid = true 
     whenNew<MockableClass>("com.example.MockableClass") 
       .withAnyArguments() 
       .thenReturn(instance) 
     assertEquals(instance, MockableClass.getInstance(context)) 
    } 
}