@@ -47,6 +47,7 @@ import io.mockk.every
4747import io.mockk.mockk
4848import io.mockk.mockkObject
4949import io.mockk.mockkStatic
50+ import io.mockk.spyk
5051import io.mockk.unmockkAll
5152import org.junit.After
5253import org.junit.Assert.assertEquals
@@ -75,9 +76,10 @@ class TokenMigrationActivityTest {
7576 )
7677
7778 private lateinit var mockUserAccountManager: UserAccountManager
78- private lateinit var mockSdkManager: SalesforceSDKManager
7979 private lateinit var mockRestClient: RestClient
8080 private lateinit var mockUser: UserAccount
81+ private lateinit var mockClientManager: com.salesforce.androidsdk.rest.ClientManager
82+ private lateinit var savedFactory: ViewModelProvider .Factory
8183
8284 @Before
8385 fun setUp () {
@@ -92,9 +94,9 @@ class TokenMigrationActivityTest {
9294 SalesforceLogger .resetLoggerPrefs(getApplicationContext())
9395
9496 mockUserAccountManager = mockk(relaxed = true )
95- mockSdkManager = mockk(relaxed = true )
9697 mockRestClient = mockk(relaxed = true )
9798 mockUser = mockk(relaxed = true )
99+ mockClientManager = mockk(relaxed = true )
98100
99101 // Mock user properties needed for getAuthorizationUrl
100102 every { mockUser.instanceServer } returns " https://test.salesforce.com"
@@ -108,13 +110,18 @@ class TokenMigrationActivityTest {
108110 mockUserAccountManager.getUserFromOrgAndUserId(INVALID_ORG , INVALID_USER )
109111 } returns null
110112
111- mockkObject(SalesforceSDKManager )
112- mockkObject(SalesforceSDKManager .Companion )
113- every { SalesforceSDKManager .getInstance() } returns mockSdkManager
114- every { mockSdkManager.appContext } returns getApplicationContext()
115- every { mockSdkManager.clientManager.peekRestClient(any<UserAccount >()) } returns mockRestClient
116- every { mockSdkManager.useHybridAuthentication } returns false
117- every { mockSdkManager.userAgent } returns " MockUserAgent"
113+ // Get the REAL SalesforceSDKManager instance and save properties
114+ val realSdkManager = SalesforceSDKManager .getInstance()
115+ savedFactory = realSdkManager.loginViewModelFactory
116+
117+ // Mock only the clientManager on the real instance using spyk
118+ val sdkManagerSpy = spyk(realSdkManager)
119+ every { sdkManagerSpy.clientManager } returns mockClientManager
120+ every { mockClientManager.peekRestClient(any<UserAccount >()) } returns mockRestClient
121+
122+ // Replace getInstance() to return our spy instead of completely mocking the object
123+ mockkStatic(SalesforceSDKManager ::class )
124+ every { SalesforceSDKManager .getInstance() } returns sdkManagerSpy
118125
119126 // Default mock for sendSync to prevent hanging - tests can override this
120127 val mockResponse = mockk< com.salesforce.androidsdk.rest.RestResponse > (relaxed = true )
@@ -129,6 +136,13 @@ class TokenMigrationActivityTest {
129136
130137 @After
131138 fun tearDown () {
139+ // Restore the loginViewModelFactory on the real instance before unmocking
140+ try {
141+ val realSdkManager = SalesforceSDKManager .getInstance()
142+ realSdkManager.loginViewModelFactory = savedFactory
143+ } catch (e: Exception ) {
144+ // If getInstance() is still mocked, this will fail - unmockkAll will clean it up
145+ }
132146 unmockkAll()
133147 }
134148
@@ -326,7 +340,7 @@ class TokenMigrationActivityTest {
326340
327341 // Throw exception when getting client
328342 every {
329- mockSdkManager.clientManager .peekRestClient(any<UserAccount >())
343+ mockClientManager .peekRestClient(any<UserAccount >())
330344 } throws RuntimeException (" Account not found" )
331345
332346 // When
@@ -372,8 +386,8 @@ class TokenMigrationActivityTest {
372386 every { asString() } returns " {}"
373387 }
374388
375- // Mock loginViewModelFactory
376- every { mockSdkManager. loginViewModelFactory } returns object : ViewModelProvider .Factory {
389+ // Mock loginViewModelFactory on the real/spied instance
390+ SalesforceSDKManager .getInstance(). loginViewModelFactory = object : ViewModelProvider .Factory {
377391 @Suppress(" UNCHECKED_CAST" )
378392 override fun <T : ViewModel > create (modelClass : Class <T >, extras : CreationExtras ): T {
379393 return mockk<LoginViewModel >(relaxed = true ) as T
0 commit comments