From 51200c52fd69c4364781a53d4a54298c1d697100 Mon Sep 17 00:00:00 2001 From: mrenouf Date: Wed, 1 Nov 2023 10:07:49 -0400 Subject: Adds a MockSettings default arg and a throwing default Answer Allows configuring a mock with different default settings while still using a fluent Kotlin friendly syntax. Also adds THROWS_EXCEPTION, which can be used as a default answer within MockSettings: mock(withSettings().defaultAnswer(THROWS_EXCEPTION) Change-Id: I8aadc5da5aaaff865a7a163dd76ea047b61fd2d6 --- .../android/intentresolver/MockitoKotlinHelpers.kt | 36 +++++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) (limited to 'java') diff --git a/java/tests/src/com/android/intentresolver/MockitoKotlinHelpers.kt b/java/tests/src/com/android/intentresolver/MockitoKotlinHelpers.kt index aaa7a282..db9fbd93 100644 --- a/java/tests/src/com/android/intentresolver/MockitoKotlinHelpers.kt +++ b/java/tests/src/com/android/intentresolver/MockitoKotlinHelpers.kt @@ -23,12 +23,14 @@ package com.android.intentresolver * causes Kotlin to skip the null checks. * Cloned from frameworks/base/packages/SystemUI/tests/utils/src/com/android/systemui/util/mockito/KotlinMockitoHelpers.kt */ - import org.mockito.ArgumentCaptor import org.mockito.ArgumentMatcher import org.mockito.ArgumentMatchers +import org.mockito.MockSettings import org.mockito.Mockito +import org.mockito.stubbing.Answer import org.mockito.stubbing.OngoingStubbing +import org.mockito.stubbing.Stubber /** * Returns Mockito.eq() as nullable type to avoid java.lang.IllegalStateException when @@ -83,8 +85,10 @@ inline fun argumentCaptor(): ArgumentCaptor = * * @param apply builder function to simplify stub configuration by improving type inference. */ -inline fun mock(apply: T.() -> Unit = {}): T = Mockito.mock(T::class.java) - .apply(apply) +inline fun mock( + mockSettings: MockSettings = Mockito.withSettings(), + apply: T.() -> Unit = {} +): T = Mockito.mock(T::class.java, mockSettings).apply(apply) /** * Helper function for stubbing methods without the need to use backticks. @@ -93,6 +97,11 @@ inline fun mock(apply: T.() -> Unit = {}): T = Mockito.mock(T: */ fun whenever(methodCall: T): OngoingStubbing = Mockito.`when`(methodCall) +/** + * Helper function for stubbing methods without the need to use backticks. + */ +fun Stubber.whenever(mock: T): T = `when`(mock) + /** * A kotlin implemented wrapper of [ArgumentCaptor] which prevents the following exception when * kotlin tests are mocking kotlin objects and the methods take non-null parameters: @@ -144,6 +153,25 @@ inline fun withArgCaptor(block: KotlinArgumentCaptor.() -> * val capturedList = captureMany { verify(...).someMethod(capture()) } */ inline fun captureMany(block: KotlinArgumentCaptor.() -> Unit): List = - kotlinArgumentCaptor().apply{ block() }.allValues + kotlinArgumentCaptor().apply { block() }.allValues inline fun anyOrNull() = ArgumentMatchers.argThat(ArgumentMatcher { true }) + +/** + * Intended as a default Answer for a mock to prevent dependence on defaults. + * + * Use as: + * ``` + * val context = mock(withSettings() + * .defaultAnswer(THROWS_EXCEPTION)) + * ``` + * + * To avoid triggering the exception during stubbing, must ONLY use one of the doXXX() methods, such + * as: + * * [doAnswer][Mockito.doAnswer] + * * [doCallRealMethod][Mockito.doCallRealMethod] + * * [doNothing][Mockito.doNothing] + * * [doReturn][Mockito.doReturn] + * * [doThrow][Mockito.doThrow] + */ +val THROWS_EXCEPTION = Answer { error("Unstubbed behavior was accessed.") } -- cgit v1.2.3-59-g8ed1b