Mockk: Mocking objects with parameters causes NPE when mocking their methods/params return

Created on 4 Jul 2018  ·  4Comments  ·  Source: mockk/mockk

Expected Behavior

Object method call is mocked properly.

Current Behavior

I get NPE on the parameter method calls.

Failure Information (for bugs)

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference

Steps to Reproduce

Mocked class:

@Singleton
class NetworkManager(private val context: Context) {

    val networkAvailable: Boolean
        get() =
            (context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).activeNetworkInfo?.isConnected ?:
            false
}

Mocked in:

import io.mockk.every
import io.mockk.mockk
...
@Singleton
    @Provides
    fun provideNetworkManager(): NetworkManager {
        val mock: NetworkManager = mockk()
        every { mock.networkAvailable } returns false                <-- crash
        return mock
    }
...

I have tried converting property val networkAvailable to a fun;
Mock with relaxed (val mock: NetworkManager = mockk(relaxed = true));
None of it helped.

Should the actual method/property get implementation be called on it's mocking?

Context

  • MockK version: 1.8.5
  • OS: android P
  • Kotlin version: 1.2.50
  • JDK version: 1.8
  • Type of test: android instrumented test

Stack trace

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
at com.deividasstr.data.networking.manager.NetworkManager.networkAvailable(NetworkManager.kt:11)
at com.deividasstr.ui.utils.di.TestNetworkModule$provideNetworkManager$1.invoke(TestNetworkModule.kt:66)
at com.deividasstr.ui.utils.di.TestNetworkModule$provideNetworkManager$1.invoke(TestNetworkModule.kt:18)
at io.mockk.impl.eval.RecordedBlockEvaluator$record$block$1.invoke(RecordedBlockEvaluator.kt:22)
at io.mockk.impl.recording.JvmAutoHinter.autoHint(JvmAutoHinter.kt:23)
at io.mockk.impl.eval.RecordedBlockEvaluator.record(RecordedBlockEvaluator.kt:31)
at io.mockk.impl.eval.EveryBlockEvaluator.every(EveryBlockEvaluator.kt:25)
at io.mockk.MockKDsl.internalEvery(API.kt:93)
at io.mockk.MockKKt.every(MockK.kt:79)
at com.deividasstr.ui.utils.di.TestNetworkModule.provideNetworkManager(TestNetworkModule.kt:66)
at com.deividasstr.ui.utils.di.TestNetworkModule_ProvideNetworkManagerFactory.proxyProvideNetworkManager(TestNetworkModule_ProvideNetworkManagerFactory.java:31)
at com.deividasstr.ui.utils.di.TestNetworkModule_ProvideNetworkManagerFactory.provideInstance(TestNetworkModule_ProvideNetworkManagerFactory.java:22)
at com.deividasstr.ui.utils.di.TestNetworkModule_ProvideNetworkManagerFactory.get(TestNetworkModule_ProvideNetworkManagerFactory.java:18)
at com.deividasstr.ui.utils.di.TestNetworkModule_ProvideNetworkManagerFactory.get(TestNetworkModule_ProvideNetworkManagerFactory.java:8)
at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
at com.deividasstr.ui.utils.di.DaggerTestAppComponent$MainActivitySubcomponentImpl.injectMainActivity(DaggerTestAppComponent.java:994)
at com.deividasstr.ui.utils.di.DaggerTestAppComponent$MainActivitySubcomponentImpl.inject(DaggerTestAppComponent.java:983)
at com.deividasstr.ui.utils.di.DaggerTestAppComponent$MainActivitySubcomponentImpl.inject(DaggerTestAppComponent.java:936)
at dagger.android.DispatchingAndroidInjector.maybeInject(DispatchingAndroidInjector.java:81)
at dagger.android.DispatchingAndroidInjector.inject(DispatchingAndroidInjector.java:102)
at dagger.android.AndroidInjection.inject(AndroidInjection.java:59)
at dagger.android.support.DaggerAppCompatActivity.onCreate(DaggerAppCompatActivity.java:43)
at com.deividasstr.ui.features.main.MainActivity.onCreate(MainActivity.kt:22)
at android.app.Activity.performCreate(Activity.java:7131)
at android.app.Activity.performCreate(Activity.java:7122)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at androidx.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:667)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2882)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3037)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1797)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6642)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.deividasstr.sweetscounter/com.deividasstr.ui.features.main.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2902)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3037)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1797)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6642)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
at com.deividasstr.data.networking.manager.NetworkManager.networkAvailable(NetworkManager.kt:11)
at com.deividasstr.ui.utils.di.TestNetworkModule$provideNetworkManager$1.invoke(TestNetworkModule.kt:66)
at com.deividasstr.ui.utils.di.TestNetworkModule$provideNetworkManager$1.invoke(TestNetworkModule.kt:18)
at io.mockk.impl.eval.RecordedBlockEvaluator$record$block$1.invoke(RecordedBlockEvaluator.kt:22)
at io.mockk.impl.recording.JvmAutoHinter.autoHint(JvmAutoHinter.kt:23)
at io.mockk.impl.eval.RecordedBlockEvaluator.record(RecordedBlockEvaluator.kt:31)
at io.mockk.impl.eval.EveryBlockEvaluator.every(EveryBlockEvaluator.kt:25)
at io.mockk.MockKDsl.internalEvery(API.kt:93)
at io.mockk.MockKKt.every(MockK.kt:79)
at com.deividasstr.ui.utils.di.TestNetworkModule.provideNetworkManager(TestNetworkModule.kt:66)
at com.deividasstr.ui.utils.di.TestNetworkModule_ProvideNetworkManagerFactory.proxyProvideNetworkManager(TestNetworkModule_ProvideNetworkManagerFactory.java:31)
at com.deividasstr.ui.utils.di.TestNetworkModule_ProvideNetworkManagerFactory.provideInstance(TestNetworkModule_ProvideNetworkManagerFactory.java:22)
at com.deividasstr.ui.utils.di.TestNetworkModule_ProvideNetworkManagerFactory.get(TestNetworkModule_ProvideNetworkManagerFactory.java:18)
at com.deividasstr.ui.utils.di.TestNetworkModule_ProvideNetworkManagerFactory.get(TestNetworkModule_ProvideNetworkManagerFactory.java:8)
at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
at com.deividasstr.ui.utils.di.DaggerTestAppComponent$MainActivitySubcomponentImpl.injectMainActivity(DaggerTestAppComponent.java:994)
at com.deividasstr.ui.utils.di.DaggerTestAppComponent$MainActivitySubcomponentImpl.inject(DaggerTestAppComponent.java:983)
at com.deividasstr.ui.utils.di.DaggerTestAppComponent$MainActivitySubcomponentImpl.inject(DaggerTestAppComponent.java:936)
at dagger.android.DispatchingAndroidInjector.maybeInject(DispatchingAndroidInjector.java:81)
at dagger.android.DispatchingAndroidInjector.inject(DispatchingAndroidInjector.java:102)
at dagger.android.AndroidInjection.inject(AndroidInjection.java:59)
at dagger.android.support.DaggerAppCompatActivity.onCreate(DaggerAppCompatActivity.java:43)
at com.deividasstr.ui.features.main.MainActivity.onCreate(MainActivity.kt:22)
at android.app.Activity.performCreate(Activity.java:7131)
at android.app.Activity.performCreate(Activity.java:7122)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at androidx.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:667)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2882)
... 11 more

Test running failed: Instrumentation run failed due to 'Process crashed.'

Most helpful comment

I'm still facing the same issue

All 4 comments

Thanks for reporting it, will check it later

ср, 4 июля 2018 г., 10:16 Deividas Strioga notifications@github.com:

Expected Behavior

Object method call is mocked properly.
Current Behavior

I get NPE on the parameter method calls.
Failure Information (for bugs)

java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.Object
android.content.Context.getSystemService(java.lang.String)' on a null
object reference
Steps to Reproduce

Mocked class:

@Singleton
class NetworkManager(private val context: Context) {

val networkAvailable: Boolean
    get() =
        (context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).activeNetworkInfo?.isConnected ?:
        false

}

Mocked in:

import io.mockk.every
import io.mockk.mockk
...
@Singleton
@Provides
fun provideNetworkManager(): NetworkManager {
val mock: NetworkManager = mockk()
every { mock.networkAvailable } returns false <-- crash
return mock
}
...

I have tried converting property val networkAvailable to a fun;
Mock with relaxed (val mock: NetworkManager = mockk(relaxed = true));
None of it helped.

Should the actual method/property get implementation be called on it's
mocking?
Context

  • MockK version: 1.8.5
  • OS: android P
  • Kotlin version: 1.2.50
  • JDK version: 1.8
  • Type of test: android instrumented test

Stack trace

java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.Object
android.content.Context.getSystemService(java.lang.String)' on a null
object reference
at
com.deividasstr.data.networking.manager.NetworkManager.networkAvailable(NetworkManager.kt:11)
at
com.deividasstr.ui.utils.di.TestNetworkModule$provideNetworkManager$1.invoke(TestNetworkModule.kt:66)
at
com.deividasstr.ui.utils.di.TestNetworkModule$provideNetworkManager$1.invoke(TestNetworkModule.kt:18)
at
io.mockk.impl.eval.RecordedBlockEvaluator$record$block$1.invoke(RecordedBlockEvaluator.kt:22)
at io.mockk.impl.recording.JvmAutoHinter.autoHint(JvmAutoHinter.kt:23)
at
io.mockk.impl.eval.RecordedBlockEvaluator.record(RecordedBlockEvaluator.kt:31)
at io.mockk.impl.eval.EveryBlockEvaluator.every(EveryBlockEvaluator.kt:25)
at io.mockk.MockKDsl.internalEvery(API.kt:93)
at io.mockk.MockKKt.every(MockK.kt:79)
at
com.deividasstr.ui.utils.di.TestNetworkModule.provideNetworkManager(TestNetworkModule.kt:66)
at
com.deividasstr.ui.utils.di.TestNetworkModule_ProvideNetworkManagerFactory.proxyProvideNetworkManager(TestNetworkModule_ProvideNetworkManagerFactory.java:31)
at
com.deividasstr.ui.utils.di.TestNetworkModule_ProvideNetworkManagerFactory.provideInstance(TestNetworkModule_ProvideNetworkManagerFactory.java:22)
at
com.deividasstr.ui.utils.di.TestNetworkModule_ProvideNetworkManagerFactory.get(TestNetworkModule_ProvideNetworkManagerFactory.java:18)
at
com.deividasstr.ui.utils.di.TestNetworkModule_ProvideNetworkManagerFactory.get(TestNetworkModule_ProvideNetworkManagerFactory.java:8)
at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
at
com.deividasstr.ui.utils.di.DaggerTestAppComponent$MainActivitySubcomponentImpl.injectMainActivity(DaggerTestAppComponent.java:994)
at
com.deividasstr.ui.utils.di.DaggerTestAppComponent$MainActivitySubcomponentImpl.inject(DaggerTestAppComponent.java:983)
at
com.deividasstr.ui.utils.di.DaggerTestAppComponent$MainActivitySubcomponentImpl.inject(DaggerTestAppComponent.java:936)
at
dagger.android.DispatchingAndroidInjector.maybeInject(DispatchingAndroidInjector.java:81)
at
dagger.android.DispatchingAndroidInjector.inject(DispatchingAndroidInjector.java:102)
at dagger.android.AndroidInjection.inject(AndroidInjection.java:59)
at
dagger.android.support.DaggerAppCompatActivity.onCreate(DaggerAppCompatActivity.java:43)
at
com.deividasstr.ui.features.main.MainActivity.onCreate(MainActivity.kt:22)
at android.app.Activity.performCreate(Activity.java:7131)
at android.app.Activity.performCreate(Activity.java:7122)
at
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at
androidx.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:667)
at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2882)
at
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3037)
at
android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at
android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at
android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1797)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6642)
at java.lang.reflect.Method.invoke(Native Method)
at
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.deividasstr.sweetscounter/com.deividasstr.ui.features.main.MainActivity}:
java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.Object
android.content.Context.getSystemService(java.lang.String)' on a null
object reference
at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2902)
at
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3037)
at
android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at
android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at
android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1797)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6642)
at java.lang.reflect.Method.invoke(Native Method)
at
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual
method 'java.lang.Object
android.content.Context.getSystemService(java.lang.String)' on a null
object reference
at
com.deividasstr.data.networking.manager.NetworkManager.networkAvailable(NetworkManager.kt:11)
at
com.deividasstr.ui.utils.di.TestNetworkModule$provideNetworkManager$1.invoke(TestNetworkModule.kt:66)
at
com.deividasstr.ui.utils.di.TestNetworkModule$provideNetworkManager$1.invoke(TestNetworkModule.kt:18)
at
io.mockk.impl.eval.RecordedBlockEvaluator$record$block$1.invoke(RecordedBlockEvaluator.kt:22)
at io.mockk.impl.recording.JvmAutoHinter.autoHint(JvmAutoHinter.kt:23)
at
io.mockk.impl.eval.RecordedBlockEvaluator.record(RecordedBlockEvaluator.kt:31)
at io.mockk.impl.eval.EveryBlockEvaluator.every(EveryBlockEvaluator.kt:25)
at io.mockk.MockKDsl.internalEvery(API.kt:93)
at io.mockk.MockKKt.every(MockK.kt:79)
at
com.deividasstr.ui.utils.di.TestNetworkModule.provideNetworkManager(TestNetworkModule.kt:66)
at
com.deividasstr.ui.utils.di.TestNetworkModule_ProvideNetworkManagerFactory.proxyProvideNetworkManager(TestNetworkModule_ProvideNetworkManagerFactory.java:31)
at
com.deividasstr.ui.utils.di.TestNetworkModule_ProvideNetworkManagerFactory.provideInstance(TestNetworkModule_ProvideNetworkManagerFactory.java:22)
at
com.deividasstr.ui.utils.di.TestNetworkModule_ProvideNetworkManagerFactory.get(TestNetworkModule_ProvideNetworkManagerFactory.java:18)
at
com.deividasstr.ui.utils.di.TestNetworkModule_ProvideNetworkManagerFactory.get(TestNetworkModule_ProvideNetworkManagerFactory.java:8)
at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
at
com.deividasstr.ui.utils.di.DaggerTestAppComponent$MainActivitySubcomponentImpl.injectMainActivity(DaggerTestAppComponent.java:994)
at
com.deividasstr.ui.utils.di.DaggerTestAppComponent$MainActivitySubcomponentImpl.inject(DaggerTestAppComponent.java:983)
at
com.deividasstr.ui.utils.di.DaggerTestAppComponent$MainActivitySubcomponentImpl.inject(DaggerTestAppComponent.java:936)
at
dagger.android.DispatchingAndroidInjector.maybeInject(DispatchingAndroidInjector.java:81)
at
dagger.android.DispatchingAndroidInjector.inject(DispatchingAndroidInjector.java:102)
at dagger.android.AndroidInjection.inject(AndroidInjection.java:59)
at
dagger.android.support.DaggerAppCompatActivity.onCreate(DaggerAppCompatActivity.java:43)
at
com.deividasstr.ui.features.main.MainActivity.onCreate(MainActivity.kt:22)
at android.app.Activity.performCreate(Activity.java:7131)
at android.app.Activity.performCreate(Activity.java:7122)
at
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at
androidx.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:667)
at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2882)
... 11 more

Test running failed: Instrumentation run failed due to 'Process crashed.'


You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/mockk/mockk/issues/105, or mute the thread
https://github.com/notifications/unsubscribe-auth/AFAbjFz2jWqWr1lNjwYn5TrBsaYJ-sx3ks5uDHnggaJpZM4VCJer
.

Any update? I'm facing the same issue with Android's Locale.getLanguage().

Edit: Updating from MockK 1.8.3 to 1.8.7 resolved this for me!

I think I am still having this issue in MockK 1.8.13.kotlin13, but only on the mockk-android flavor.

I'm still facing the same issue

Was this page helpful?
0 / 5 - 0 ratings