嘲笑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)) } }