mockito Android:模拟GoogleSignIn.getClient导致空指针异常

f87krz0w  于 2023-06-22  发布在  Android
关注(0)|答案(1)|浏览(117)

尝试模拟静态对象GoogleSignIn.getClient()方法,但从initialize()方法得到以下错误:
getClient(context, gso) must not be null java.lang.NullPointerException: getClient(context, gso) must not be null
这是被测试的班级

package com.example.hellogooglesignin

import android.content.Context
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInClient
import com.google.android.gms.auth.api.signin.GoogleSignInOptions

data class UserAccount(val context: Context) {
    private lateinit var googleSignInClient: GoogleSignInClient

    fun initialize() {
        val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build()
        googleSignInClient = GoogleSignIn.getClient(context, gso)
    }
}

和单元测试代码

package com.example.hellogooglesignin

import android.content.Context
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInClient
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test
import org.mockito.ArgumentMatchers.any
import org.mockito.Mock
import org.mockito.Mockito

class GoogleSignInTest {
    @Mock
    private lateinit var googleSignInClient: GoogleSignInClient
    @Mock
    private lateinit var context: Context

    @Before
    fun setup() {
        googleSignInClient = Mockito.mock(GoogleSignInClient::class.java)
        context = Mockito.mock(Context::class.java)
    }

    @Test
    fun testInitialize() {
        Mockito.mockStatic(GoogleSignIn::class.java).use { ms ->
            ms.`when`<GoogleSignInClient> { GoogleSignIn.getClient(any(), any()) }.thenReturn(googleSignInClient)

            val account = UserAccount(context)
            account.initialize()
            assertEquals(1, 1)
        }
    }
}

GoogleSignInClient返回的模拟对象不为null:

你知道吗?
使用:

implementation 'com.google.android.gms:play-services-auth:20.5.0'

    testImplementation 'junit:junit:4.13.2'
    testImplementation 'org.mockito:mockito-core:4.5.1'
    testImplementation 'org.mockito:mockito-inline:3.5.6'
a6b3iqyw

a6b3iqyw1#

通过替换解决
GoogleSignIn.getClient(any(), any())

GoogleSignIn.getClient(any(Context::class.java), any(GoogleSignInOptions::class.java))

相关问题