mockk: Bug: StackOverflowError on constructor mocks for Android view classes

i have also asked this on stackoverflow this is how we do it for simple java objects that we instantiate ourselves not like Android Views that are instantiated by system

below test passes successfully

@Test
    fun mockingConstructor() {
        //with
        mockkConstructor(Car::class) 
    //from now all Car instances acts as if they are a <<spy>>
        every { anyConstructed<Car>().wheelsCount() } returns 6

        //assertions
        assertEquals(Car("plate-number1").wheelsCount(), 6) //pass
        assertEquals(Car("plate-number2").wheelsCount(), 6) //pass
        assertEquals(Car("plate-number3").wheelsCount(), 6) //pass

        //other functions work as implemented in their classes like :
        assertEquals(Car("plate-number4").drive(), "now driving") //pass
}

problem

this how i try to spy android view constructors which fails

@RunWith(RobolectricTestRunner::class)
class TestClass {

    @Test
    fun test2() {
        mockkConstructor(MyCustomView::class)
        //a simple empty activity that uses myCustomView in its layout.xml
        val activity = Robolectric.setupActivity(NavTestActivity::class.java)
    }

}

Error

this is the error i get :

java.lang.StackOverflowError
at android.view.ViewGroup.resolveLayoutParams(ViewGroup.java)
at io.mockk.proxy.jvm.advice.MethodCall.call(MethodCall.kt:14)
at io.mockk.proxy.jvm.advice.SelfCallEliminatorCallable.call(SelfCallEliminatorCallable.kt:14)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.handleOriginalCall(JvmMockFactoryHelper.kt:82)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.access$handleOriginalCall(JvmMockFactoryHelper.kt:19)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1$invocation$$inlined$stdFunctions$lambda$1.invoke(JvmMockFactoryHelper.kt:27)
at io.mockk.impl.stub.MockKStub$handleInvocation$originalPlusToString$1.invoke(MockKStub.kt:177)
at io.mockk.impl.stub.SpyKStub.defaultAnswer(SpyKStub.kt:14)
at io.mockk.impl.stub.MockKStub.answer(MockKStub.kt:48)
at io.mockk.impl.stub.ConstructorStub.answer(ConstructorStub.kt:29)
at io.mockk.impl.recording.states.AnsweringState.call(AnsweringState.kt:16)
at io.mockk.impl.recording.CommonCallRecorder.call(CommonCallRecorder.kt:48)
at io.mockk.impl.stub.MockKStub.handleInvocation(MockKStub.kt:224)
at io.mockk.impl.stub.ConstructorStub.handleInvocation(ConstructorStub.kt:70)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1.invocation(JvmMockFactoryHelper.kt:24)
at io.mockk.proxy.jvm.advice.Interceptor.call(Interceptor.kt:20)
at android.view.View.resolveLayoutParams(View.java)
at android.view.ViewGroup.resolveLayoutParams(ViewGroup.java:7335)
at io.mockk.proxy.jvm.advice.MethodCall.call(MethodCall.kt:14)
at io.mockk.proxy.jvm.advice.SelfCallEliminatorCallable.call(SelfCallEliminatorCallable.kt:14)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.handleOriginalCall(JvmMockFactoryHelper.kt:82)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.access$handleOriginalCall(JvmMockFactoryHelper.kt:19)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1$invocation$$inlined$stdFunctions$lambda$1.invoke(JvmMockFactoryHelper.kt:27)
at io.mockk.impl.stub.MockKStub$handleInvocation$originalPlusToString$1.invoke(MockKStub.kt:177)
at io.mockk.impl.stub.SpyKStub.defaultAnswer(SpyKStub.kt:14)
at io.mockk.impl.stub.MockKStub.answer(MockKStub.kt:48)
at io.mockk.impl.stub.ConstructorStub.answer(ConstructorStub.kt:29)
at io.mockk.impl.recording.states.AnsweringState.call(AnsweringState.kt:16)
at io.mockk.impl.recording.CommonCallRecorder.call(CommonCallRecorder.kt:48)
at io.mockk.impl.stub.MockKStub.handleInvocation(MockKStub.kt:224)
at io.mockk.impl.stub.ConstructorStub.handleInvocation(ConstructorStub.kt:70)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1.invocation(JvmMockFactoryHelper.kt:24)
at io.mockk.proxy.jvm.advice.Interceptor.call(Interceptor.kt:20)
at android.view.ViewGroup.resolveLayoutParams(ViewGroup.java:7341)
at io.mockk.proxy.jvm.advice.MethodCall.call(MethodCall.kt:14)
at io.mockk.proxy.jvm.advice.SelfCallEliminatorCallable.call(SelfCallEliminatorCallable.kt:14)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.handleOriginalCall(JvmMockFactoryHelper.kt:82)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.access$handleOriginalCall(JvmMockFactoryHelper.kt:19)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1$invocation$$inlined$stdFunctions$lambda$1.invoke(JvmMockFactoryHelper.kt:27)
at io.mockk.impl.stub.MockKStub$handleInvocation$originalPlusToString$1.invoke(MockKStub.kt:177)
at io.mockk.impl.stub.SpyKStub.defaultAnswer(SpyKStub.kt:14)
at io.mockk.impl.stub.MockKStub.answer(MockKStub.kt:48)
at io.mockk.impl.stub.ConstructorStub.answer(ConstructorStub.kt:29)
at io.mockk.impl.recording.states.AnsweringState.call(AnsweringState.kt:16)
at io.mockk.impl.recording.CommonCallRecorder.call(CommonCallRecorder.kt:48)
at io.mockk.impl.stub.MockKStub.handleInvocation(MockKStub.kt:224)
at io.mockk.impl.stub.ConstructorStub.handleInvocation(ConstructorStub.kt:70)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1.invocation(JvmMockFactoryHelper.kt:24)
at io.mockk.proxy.jvm.advice.Interceptor.call(Interceptor.kt:20)
at android.view.View.resolveLayoutParams(View.java)
at android.view.ViewGroup.resolveLayoutParams(ViewGroup.java:7335)
at io.mockk.proxy.jvm.advice.MethodCall.call(MethodCall.kt:14)
at io.mockk.proxy.jvm.advice.SelfCallEliminatorCallable.call(SelfCallEliminatorCallable.kt:14)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.handleOriginalCall(JvmMockFactoryHelper.kt:82)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.access$handleOriginalCall(JvmMockFactoryHelper.kt:19)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1$invocation$$inlined$stdFunctions$lambda$1.invoke(JvmMockFactoryHelper.kt:27)
at io.mockk.impl.stub.MockKStub$handleInvocation$originalPlusToString$1.invoke(MockKStub.kt:177)
at io.mockk.impl.stub.SpyKStub.defaultAnswer(SpyKStub.kt:14)
at io.mockk.impl.stub.MockKStub.answer(MockKStub.kt:48)
at io.mockk.impl.stub.ConstructorStub.answer(ConstructorStub.kt:29)
at io.mockk.impl.recording.states.AnsweringState.call(AnsweringState.kt:16)
at io.mockk.impl.recording.CommonCallRecorder.call(CommonCallRecorder.kt:48)
at io.mockk.impl.stub.MockKStub.handleInvocation(MockKStub.kt:224)
at io.mockk.impl.stub.ConstructorStub.handleInvocation(ConstructorStub.kt:70)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1.invocation(JvmMockFactoryHelper.kt:24)
at io.mockk.proxy.jvm.advice.Interceptor.call(Interceptor.kt:20)
at android.view.ViewGroup.resolveLayoutParams(ViewGroup.java:7341)
at io.mockk.proxy.jvm.advice.MethodCall.call(MethodCall.kt:14)
at io.mockk.proxy.jvm.advice.SelfCallEliminatorCallable.call(SelfCallEliminatorCallable.kt:14)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.handleOriginalCall(JvmMockFactoryHelper.kt:82)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.access$handleOriginalCall(JvmMockFactoryHelper.kt:19)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1$invocation$$inlined$stdFunctions$lambda$1.invoke(JvmMockFactoryHelper.kt:27)
at io.mockk.impl.stub.MockKStub$handleInvocation$originalPlusToString$1.invoke(MockKStub.kt:177)
at io.mockk.impl.stub.SpyKStub.defaultAnswer(SpyKStub.kt:14)
at io.mockk.impl.stub.MockKStub.answer(MockKStub.kt:48)
at io.mockk.impl.stub.ConstructorStub.answer(ConstructorStub.kt:29)
at io.mockk.impl.recording.states.AnsweringState.call(AnsweringState.kt:16)
at io.mockk.impl.recording.CommonCallRecorder.call(CommonCallRecorder.kt:48)
at io.mockk.impl.stub.MockKStub.handleInvocation(MockKStub.kt:224)
at io.mockk.impl.stub.ConstructorStub.handleInvocation(ConstructorStub.kt:70)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1.invocation(JvmMockFactoryHelper.kt:24)
at io.mockk.proxy.jvm.advice.Interceptor.call(Interceptor.kt:20)
at android.view.View.resolveLayoutParams(View.java)
at android.view.ViewGroup.resolveLayoutParams(ViewGroup.java:7335)
at io.mockk.proxy.jvm.advice.MethodCall.call(MethodCall.kt:14)
at io.mockk.proxy.jvm.advice.SelfCallEliminatorCallable.call(SelfCallEliminatorCallable.kt:14)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.handleOriginalCall(JvmMockFactoryHelper.kt:82)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.access$handleOriginalCall(JvmMockFactoryHelper.kt:19)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1$invocation$$inlined$stdFunctions$lambda$1.invoke(JvmMockFactoryHelper.kt:27)
at io.mockk.impl.stub.MockKStub$handleInvocation$originalPlusToString$1.invoke(MockKStub.kt:177)
at io.mockk.impl.stub.SpyKStub.defaultAnswer(SpyKStub.kt:14)
at io.mockk.impl.stub.MockKStub.answer(MockKStub.kt:48)
at io.mockk.impl.stub.ConstructorStub.answer(ConstructorStub.kt:29)
at io.mockk.impl.recording.states.AnsweringState.call(AnsweringState.kt:16)
at io.mockk.impl.recording.CommonCallRecorder.call(CommonCallRecorder.kt:48)
at io.mockk.impl.stub.MockKStub.handleInvocation(MockKStub.kt:224)
at io.mockk.impl.stub.ConstructorStub.handleInvocation(ConstructorStub.kt:70)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1.invocation(JvmMockFactoryHelper.kt:24)
at io.mockk.proxy.jvm.advice.Interceptor.call(Interceptor.kt:20)
at android.view.ViewGroup.resolveLayoutParams(ViewGroup.java:7341)
at io.mockk.proxy.jvm.advice.MethodCall.call(MethodCall.kt:14)
at io.mockk.proxy.jvm.advice.SelfCallEliminatorCallable.call(SelfCallEliminatorCallable.kt:14)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.handleOriginalCall(JvmMockFactoryHelper.kt:82)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.access$handleOriginalCall(JvmMockFactoryHelper.kt:19)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1$invocation$$inlined$stdFunctions$lambda$1.invoke(JvmMockFactoryHelper.kt:27)
at io.mockk.impl.stub.MockKStub$handleInvocation$originalPlusToString$1.invoke(MockKStub.kt:177)
at io.mockk.impl.stub.SpyKStub.defaultAnswer(SpyKStub.kt:14)
at io.mockk.impl.stub.MockKStub.answer(MockKStub.kt:48)
at io.mockk.impl.stub.ConstructorStub.answer(ConstructorStub.kt:29)
at io.mockk.impl.recording.states.AnsweringState.call(AnsweringState.kt:16)
at io.mockk.impl.recording.CommonCallRecorder.call(CommonCallRecorder.kt:48)
at io.mockk.impl.stub.MockKStub.handleInvocation(MockKStub.kt:224)
at io.mockk.impl.stub.ConstructorStub.handleInvocation(ConstructorStub.kt:70)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1.invocation(JvmMockFactoryHelper.kt:24)
at io.mockk.proxy.jvm.advice.Interceptor.call(Interceptor.kt:20)
at android.view.View.resolveLayoutParams(View.java)
at android.view.ViewGroup.resolveLayoutParams(ViewGroup.java:7335)
at io.mockk.proxy.jvm.advice.MethodCall.call(MethodCall.kt:14)
at io.mockk.proxy.jvm.advice.SelfCallEliminatorCallable.call(SelfCallEliminatorCallable.kt:14)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.handleOriginalCall(JvmMockFactoryHelper.kt:82)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.access$handleOriginalCall(JvmMockFactoryHelper.kt:19)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1$invocation$$inlined$stdFunctions$lambda$1.invoke(JvmMockFactoryHelper.kt:27)
at io.mockk.impl.stub.MockKStub$handleInvocation$originalPlusToString$1.invoke(MockKStub.kt:177)
at io.mockk.impl.stub.SpyKStub.defaultAnswer(SpyKStub.kt:14)
at io.mockk.impl.stub.MockKStub.answer(MockKStub.kt:48)
at io.mockk.impl.stub.ConstructorStub.answer(ConstructorStub.kt:29)
at io.mockk.impl.recording.states.AnsweringState.call(AnsweringState.kt:16)
at io.mockk.impl.recording.CommonCallRecorder.call(CommonCallRecorder.kt:48)
at io.mockk.impl.stub.MockKStub.handleInvocation(MockKStub.kt:224)
at io.mockk.impl.stub.ConstructorStub.handleInvocation(ConstructorStub.kt:70)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1.invocation(JvmMockFactoryHelper.kt:24)
at io.mockk.proxy.jvm.advice.Interceptor.call(Interceptor.kt:20)
at android.view.ViewGroup.resolveLayoutParams(ViewGroup.java:7341)
at io.mockk.proxy.jvm.advice.MethodCall.call(MethodCall.kt:14)
at io.mockk.proxy.jvm.advice.SelfCallEliminatorCallable.call(SelfCallEliminatorCallable.kt:14)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.handleOriginalCall(JvmMockFactoryHelper.kt:82)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.access$handleOriginalCall(JvmMockFactoryHelper.kt:19)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1$invocation$$inlined$stdFunctions$lambda$1.invoke(JvmMockFactoryHelper.kt:27)
at io.mockk.impl.stub.MockKStub$handleInvocation$originalPlusToString$1.invoke(MockKStub.kt:177)
at io.mockk.impl.stub.SpyKStub.defaultAnswer(SpyKStub.kt:14)
at io.mockk.impl.stub.MockKStub.answer(MockKStub.kt:48)
at io.mockk.impl.stub.ConstructorStub.answer(ConstructorStub.kt:29)
at io.mockk.impl.recording.states.AnsweringState.call(AnsweringState.kt:16)
at io.mockk.impl.recording.CommonCallRecorder.call(CommonCallRecorder.kt:48)
at io.mockk.impl.stub.MockKStub.handleInvocation(MockKStub.kt:224)
at io.mockk.impl.stub.ConstructorStub.handleInvocation(ConstructorStub.kt:70)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1.invocation(JvmMockFactoryHelper.kt:24)
at io.mockk.proxy.jvm.advice.Interceptor.call(Interceptor.kt:20)
at android.view.View.resolveLayoutParams(View.java)
at android.view.ViewGroup.resolveLayoutParams(ViewGroup.java:7335)
at io.mockk.proxy.jvm.advice.MethodCall.call(MethodCall.kt:14)
at io.mockk.proxy.jvm.advice.SelfCallEliminatorCallable.call(SelfCallEliminatorCallable.kt:14)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.handleOriginalCall(JvmMockFactoryHelper.kt:82)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.access$handleOriginalCall(JvmMockFactoryHelper.kt:19)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1$invocation$$inlined$stdFunctions$lambda$1.invoke(JvmMockFactoryHelper.kt:27)
at io.mockk.impl.stub.MockKStub$handleInvocation$originalPlusToString$1.invoke(MockKStub.kt:177)
at io.mockk.impl.stub.SpyKStub.defaultAnswer(SpyKStub.kt:14)
at io.mockk.impl.stub.MockKStub.answer(MockKStub.kt:48)
at io.mockk.impl.stub.ConstructorStub.answer(ConstructorStub.kt:29)
at io.mockk.impl.recording.states.AnsweringState.call(AnsweringState.kt:16)
at io.mockk.impl.recording.CommonCallRecorder.call(CommonCallRecorder.kt:48)
at io.mockk.impl.stub.MockKStub.handleInvocation(MockKStub.kt:224)
at io.mockk.impl.stub.ConstructorStub.handleInvocation(ConstructorStub.kt:70)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1.invocation(JvmMockFactoryHelper.kt:24)
at io.mockk.proxy.jvm.advice.Interceptor.call(Interceptor.kt:20)
at android.view.ViewGroup.resolveLayoutParams(ViewGroup.java:7341)
at io.mockk.proxy.jvm.advice.MethodCall.call(MethodCall.kt:14)
at io.mockk.proxy.jvm.advice.SelfCallEliminatorCallable.call(SelfCallEliminatorCallable.kt:14)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.handleOriginalCall(JvmMockFactoryHelper.kt:82)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.access$handleOriginalCall(JvmMockFactoryHelper.kt:19)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1$invocation$$inlined$stdFunctions$lambda$1.invoke(JvmMockFactoryHelper.kt:27)
at io.mockk.impl.stub.MockKStub$handleInvocation$originalPlusToString$1.invoke(MockKStub.kt:177)
at io.mockk.impl.stub.SpyKStub.defaultAnswer(SpyKStub.kt:14)
at io.mockk.impl.stub.MockKStub.answer(MockKStub.kt:48)
at io.mockk.impl.stub.ConstructorStub.answer(ConstructorStub.kt:29)
at io.mockk.impl.recording.states.AnsweringState.call(AnsweringState.kt:16)
at io.mockk.impl.recording.CommonCallRecorder.call(CommonCallRecorder.kt:48)
at io.mockk.impl.stub.MockKStub.handleInvocation(MockKStub.kt:224)
at io.mockk.impl.stub.ConstructorStub.handleInvocation(ConstructorStub.kt:70)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1.invocation(JvmMockFactoryHelper.kt:24)
at io.mockk.proxy.jvm.advice.Interceptor.call(Interceptor.kt:20)
at android.view.View.resolveLayoutParams(View.java)
at android.view.ViewGroup.resolveLayoutParams(ViewGroup.java:7335)
at io.mockk.proxy.jvm.advice.MethodCall.call(MethodCall.kt:14)
at io.mockk.proxy.jvm.advice.SelfCallEliminatorCallable.call(SelfCallEliminatorCallable.kt:14)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.handleOriginalCall(JvmMockFactoryHelper.kt:82)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.access$handleOriginalCall(JvmMockFactoryHelper.kt:19)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1$invocation$$inlined$stdFunctions$lambda$1.invoke(JvmMockFactoryHelper.kt:27)
at io.mockk.impl.stub.MockKStub$handleInvocation$originalPlusToString$1.invoke(MockKStub.kt:177)
at io.mockk.impl.stub.SpyKStub.defaultAnswer(SpyKStub.kt:14)
at io.mockk.impl.stub.MockKStub.answer(MockKStub.kt:48)

...

About this issue

  • Original URL
  • State: open
  • Created 6 years ago
  • Comments: 19 (8 by maintainers)

Most upvoted comments

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions. If you are sure that this issue is important and should not be marked as stale just put an important tag.

Still facing this issue in September 2020. Any leads? How can we help fix it?

I thought the problem is with the Robolectric

After I put these

@LooperMode(LooperMode.Mode.PAUSED)
@Config(sdk = [Build.VERSION_CODES.P])

The error disappeared