I have a unit test that is throwing out the Missing calls inside verify { ... } block.
This unit test was running fine before I converted the PhoneNumberSelectionActivity from java to kotlin.
The way it was before the conversion:
@Test
fun `handle signed in but no phone number goes to PNS`() {
mockSessionInfo(sessionId = "session", userName = "name", phone = null)
mockkStatic(PhoneNumberSelectionActivity::class)
every {
PhoneNumberSelectionActivity.startActivity(
mockActivity,
any(),
any()
)
} returns Unit
assertFalse(authorizationUtils.handleNotSignedInNoPhoneNumber(mockActivity))
verify { PhoneNumberSelectionActivity.startActivity(mockActivity, true, PhoneNumberSelectionActivity.ACTIVITY_HOST_TYPE.AUTHORIZATION) }
}
But after the conversion I was getting the but I am getting:
Failed matching mocking signature for SignedCall(retValue=java.lang.Void@7a5aa8c5, isRetValueMock=false, retType=class java.lang.Void, self=TNActivityBase(mockActivity#1), method=startActivity(Intent), args=[null], invocationStr=TNActivityBase(mockActivity#1).startActivity(null)) left matchers: [any(), any()]
So I changed the test to:
@Test
fun `handle signed in but no phone number goes to PNS`() {
mockSessionInfo(sessionId = "session", userName = "name", phone = null)
mockkStatic(PhoneNumberSelectionActivity::class)
mockkConstructor(PhoneNumberSelectionActivity::class)
every {
PhoneNumberSelectionActivity.startActivity(
mockActivity,
true,
PhoneNumberSelectionActivity.ACTIVITY_HOST_TYPE.AUTHORIZATION
)
} returns mockk()
every {phoneNumberSelectionActivity.startActivity(any())} returns Unit
every {mockActivity.dismissProgressDialog()} just Runs
assertFalse(authorizationUtils.handleNotSignedInNoPhoneNumber(mockActivity))
verify { PhoneNumberSelectionActivity.startActivity(mockActivity, true, PhoneNumberSelectionActivity.ACTIVITY_HOST_TYPE.AUTHORIZATION) }
verify { phoneNumberSelectionActivity.startActivity(any()) }
}
Here is the mocked method that is throwing out the missing verify exception:
@JvmStatic
fun startActivity(
host: Activity,
phoneExpired: Boolean,
@ACTIVITY_HOST_TYPE activityHostType: Int
) {
if (sIsRunning) {
return
}
sIsRunning = true
val intent = Intent(host, PhoneNumberSelectionActivity::class.java)
intent.putExtra(EXTRA_ACTIVITY_HOST_TYPE, activityHostType)
if (phoneExpired) {
intent.putExtra(EXTRA_SHOW_PHONE_EXPIRE_DIALOG, true)
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
host.startActivity(intent)
}
And the authorizationUtils.handleNotSignedInNoPhoneNumber method:
fun handleNotSignedInNoPhoneNumber(activity: TNActivityBase): Boolean {
val sessionInfo = vessel.getBlocking(SessionInfo::class)
if (sessionInfo == null || !sessionInfo.signedIn) {
Log.d(TAG, "User is not signed in so sending to sign in page")
issueEventTracker.trackLogout(
IssueEventTracker.LOGOUT_UNAUTHENTICATED,
activity.javaClass.simpleName
)
Unregister.unregisterUser(activity)
LauncherUtils.startLaunchActivity(activity)
return false
} else if (sessionInfo.phone.isNullOrEmpty()) {
Log.d(TAG, "User does not have a phone number so sending to PNS")
activity.dismissProgressDialog()
PhoneNumberSelectionActivity.startActivity(
activity,
true,
PhoneNumberSelectionActivity.ACTIVITY_HOST_TYPE.AUTHORIZATION
)
return false
}
return true
}
It's the static method that is hosing things up and I don't know how to fix it.
I think the problem was in the java conversion of the @ACTIVITY_HOST_TYPE activityHostType: Int --
Before kotlin conversion:
private @ACTIVITY_HOST_TYPE
int activityHostType = ACTIVITY_HOST_TYPE.OTHER;
@IntDef({FRAGMENT_TRANSITION.AREA_CODE_TO_PHONE_SELECTION, FRAGMENT_TRANSITION.PHONE_SELECTION_TO_AREA_CODE})
@Retention(RetentionPolicy.SOURCE)
public @interface FRAGMENT_TRANSITION {
int AREA_CODE_TO_PHONE_SELECTION = 0;
int PHONE_SELECTION_TO_AREA_CODE = 1;
}
@IntDef({ACTIVITY_HOST_TYPE.AUTHORIZATION,
ACTIVITY_HOST_TYPE.OTHER,
ACTIVITY_HOST_TYPE.PERSONALIZED_ONBOARDING})
@Retention(RetentionPolicy.SOURCE)
public @interface ACTIVITY_HOST_TYPE {
int OTHER = -1;
int AUTHORIZATION = 0;
int PERSONALIZED_ONBOARDING = 1;
}
After kotlin conversion:
@ACTIVITY_HOST_TYPE
private var activityHostType = ACTIVITY_HOST_TYPE.OTHER
@IntDef(
flag = true,
value = [FRAGMENT_TRANSITION.AREA_CODE_TO_PHONE_SELECTION, FRAGMENT_TRANSITION.PHONE_SELECTION_TO_AREA_CODE]
)
@kotlin.annotation.Retention(AnnotationRetention.SOURCE)
annotation class FRAGMENT_TRANSITION {
companion object {
const val AREA_CODE_TO_PHONE_SELECTION = 0
const val PHONE_SELECTION_TO_AREA_CODE = 1
}
}
@IntDef(
flag = true,
value = [ACTIVITY_HOST_TYPE.OTHER, ACTIVITY_HOST_TYPE.AUTHORIZATION, ACTIVITY_HOST_TYPE.PERSONALIZED_ONBOARDING]
)
@kotlin.annotation.Retention(AnnotationRetention.SOURCE)
annotation class ACTIVITY_HOST_TYPE {
companion object {
const val OTHER = -1
const val AUTHORIZATION = 0
const val PERSONALIZED_ONBOARDING = 1
}
}
My set up:
Mockk version: 'io.mockk:mockk:1.9.3'
OS: Android
kotlin version: = '1.4.32'
junit version: 4.12