嘲笑kotlin中的伴侣对象函数

我正在使用PowerMock和Roboelectric,并且想要模拟一个类的伴侣对象函数。 当我这样做时,我得到一个错误:

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版本的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函数?

我最终做了什么

而不是whenNew静态方法,我最终使用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("com.example.MockableClass") .withAnyArguments() .thenReturn(instance) assertEquals(instance, MockableClass.getInstance(context)) } }