Skip to content

Commit 8befd67

Browse files
committed
Add documentation to custom Mockk matchers
1 parent 1cebb4b commit 8befd67

File tree

2 files changed

+34
-14
lines changed

2 files changed

+34
-14
lines changed

kotlin/src/test/kotlin/org/axonframework/extensions/kotlin/QueryGatewayExtensionsTest.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ class QueryGatewayExtensionsTest {
4141

4242
@Before
4343
fun before() {
44-
every { subjectGateway.query(queryName, exampleQuery, instanceResponseTypeMatcher<String>()) } returns instanceReturnValue
45-
every { subjectGateway.query(queryName, exampleQuery, optionalResponseTypeMatcher<String>()) } returns optionalReturnValue
46-
every { subjectGateway.query(queryName, exampleQuery, multipleInstancesResponseTypeMatcher<String>()) } returns listReturnValue
44+
every { subjectGateway.query(queryName, exampleQuery, matchInstanceResponseType<String>()) } returns instanceReturnValue
45+
every { subjectGateway.query(queryName, exampleQuery, matchOptionalResponseType<String>()) } returns optionalReturnValue
46+
every { subjectGateway.query(queryName, exampleQuery, matchMultipleInstancesResponseType<String>()) } returns listReturnValue
4747
}
4848

4949
@After
@@ -56,47 +56,47 @@ class QueryGatewayExtensionsTest {
5656
val queryResult = subjectGateway.queryForSingle<String, ExampleQuery>(queryName = queryName, query = exampleQuery)
5757

5858
assertSame(queryResult, instanceReturnValue)
59-
verify(exactly = 1) { subjectGateway.query(queryName, exampleQuery, responseTypeOfMatcher(String::class.java)) }
59+
verify(exactly = 1) { subjectGateway.query(queryName, exampleQuery, matchExpectedResponseType(String::class.java)) }
6060
}
6161

6262
@Test
6363
fun `Query for Single should invoke query method and not require explicit generic types`() {
6464
val queryResult: CompletableFuture<String> = subjectGateway.queryForSingle(queryName = queryName, query = exampleQuery)
6565

6666
assertSame(queryResult, instanceReturnValue)
67-
verify(exactly = 1) { subjectGateway.query(queryName, exampleQuery, responseTypeOfMatcher(String::class.java)) }
67+
verify(exactly = 1) { subjectGateway.query(queryName, exampleQuery, matchExpectedResponseType(String::class.java)) }
6868
}
6969

7070
@Test
7171
fun `Query for Optional should invoke query method with correct generic parameters`() {
7272
val queryResult = subjectGateway.queryForOptional<String, ExampleQuery>(queryName = queryName, query = exampleQuery)
7373

7474
assertSame(queryResult, optionalReturnValue)
75-
verify(exactly = 1) { subjectGateway.query(queryName, exampleQuery, responseTypeOfMatcher(String::class.java)) }
75+
verify(exactly = 1) { subjectGateway.query(queryName, exampleQuery, matchExpectedResponseType(String::class.java)) }
7676
}
7777

7878
@Test
7979
fun `Query for Optional should invoke query method and not require explicit generic types`() {
8080
val queryResult: CompletableFuture<Optional<String>> = subjectGateway.queryForOptional(queryName = queryName, query = exampleQuery)
8181

8282
assertSame(queryResult, optionalReturnValue)
83-
verify(exactly = 1) { subjectGateway.query(queryName, exampleQuery, responseTypeOfMatcher(String::class.java)) }
83+
verify(exactly = 1) { subjectGateway.query(queryName, exampleQuery, matchExpectedResponseType(String::class.java)) }
8484
}
8585

8686
@Test
8787
fun `Query for Multiple should invoke query method with correct generic parameters`() {
8888
val queryResult = subjectGateway.queryForMultiple<String, ExampleQuery>(queryName = queryName, query = exampleQuery)
8989

9090
assertSame(queryResult, listReturnValue)
91-
verify(exactly = 1) { subjectGateway.query(queryName, exampleQuery, responseTypeOfMatcher(String::class.java)) }
91+
verify(exactly = 1) { subjectGateway.query(queryName, exampleQuery, matchExpectedResponseType(String::class.java)) }
9292
}
9393

9494
@Test
9595
fun `Query for Multiple should invoke query method and not require explicit generic types`() {
9696
val queryResult: CompletableFuture<List<String>> = subjectGateway.queryForMultiple(queryName = queryName, query = exampleQuery)
9797

9898
assertSame(queryResult, listReturnValue)
99-
verify(exactly = 1) { subjectGateway.query(queryName, exampleQuery, responseTypeOfMatcher(String::class.java)) }
99+
verify(exactly = 1) { subjectGateway.query(queryName, exampleQuery, matchExpectedResponseType(String::class.java)) }
100100
}
101101

102102
@Test
@@ -110,7 +110,7 @@ class QueryGatewayExtensionsTest {
110110

111111
assertSame(queryResult, nullInstanceReturnValue)
112112
assertTrue(nullInstanceReturnValue.get() == null)
113-
verify(exactly = 1) { nullableQueryGateway.query(queryName, exampleQuery, responseTypeOfMatcher(String::class.java)) }
113+
verify(exactly = 1) { nullableQueryGateway.query(queryName, exampleQuery, matchExpectedResponseType(String::class.java)) }
114114
}
115115

116116
}

kotlin/src/test/kotlin/org/axonframework/extensions/kotlin/mockkExtensions.kt

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,27 @@ import org.axonframework.messaging.responsetypes.OptionalResponseType
2424
import org.axonframework.messaging.responsetypes.ResponseType
2525
import java.util.*
2626

27-
internal fun <T> MockKVerificationScope.responseTypeOfMatcher(clazz: Class<T>) = match { type: ResponseType<T> -> type.expectedResponseType == clazz }
28-
internal fun <T> MockKMatcherScope.instanceResponseTypeMatcher() = match { type: AbstractResponseType<T> -> type is InstanceResponseType }
29-
internal fun <T> MockKMatcherScope.optionalResponseTypeMatcher() = match { type: AbstractResponseType<Optional<T>> -> type is OptionalResponseType<*> }
30-
internal fun <T> MockKMatcherScope.multipleInstancesResponseTypeMatcher() = match { type: AbstractResponseType<List<T>> -> type is MultipleInstancesResponseType<*> }
27+
/**
28+
* Matches wrapped type of given [ResponseType] instead of entire [ResponseType] object
29+
* @param clazz Class object of the type to match
30+
* @param T Type wrapped by [ResponseType]
31+
*/
32+
internal fun <T> MockKVerificationScope.matchExpectedResponseType(clazz: Class<T>) = match { type: ResponseType<T> -> type.expectedResponseType == clazz }
33+
34+
/**
35+
* Matches that given [ResponseType] is [InstanceResponseType]
36+
* @param T Type wrapped by given [ResponseType] instance. Required for Mockk but will not be explicitly matched
37+
*/
38+
internal fun <T> MockKMatcherScope.matchInstanceResponseType() = match { type: AbstractResponseType<T> -> type is InstanceResponseType }
39+
40+
/**
41+
* Matches that given [ResponseType] is [OptionalResponseType]. Will not check type wrapped by the [Optional] instance
42+
* @param T Type wrapped by given [ResponseType] instance. Required for Mockk but will not be explicitly matched
43+
*/
44+
internal fun <T> MockKMatcherScope.matchOptionalResponseType() = match { type: AbstractResponseType<Optional<T>> -> type is OptionalResponseType }
45+
46+
/**
47+
* Matches that given [ResponseType] is [MultipleInstancesResponseType]. Will not check type wrapped by the [List] instance
48+
* @param T Type wrapped by given [ResponseType] instance. Required for Mockk but will not be explicitly matched
49+
*/
50+
internal fun <T> MockKMatcherScope.matchMultipleInstancesResponseType() = match { type: AbstractResponseType<List<T>> -> type is MultipleInstancesResponseType<*> }

0 commit comments

Comments
 (0)