diff --git a/mockk/common/src/main/kotlin/io/mockk/impl/instantiation/AnyValueGenerator.kt b/mockk/common/src/main/kotlin/io/mockk/impl/instantiation/AnyValueGenerator.kt index 65834a5a2..a540d146d 100644 --- a/mockk/common/src/main/kotlin/io/mockk/impl/instantiation/AnyValueGenerator.kt +++ b/mockk/common/src/main/kotlin/io/mockk/impl/instantiation/AnyValueGenerator.kt @@ -24,15 +24,15 @@ open class AnyValueGenerator { FloatArray::class -> FloatArray(0) DoubleArray::class -> DoubleArray(0) - List::class -> emptyList() - Map::class -> emptyMap() - Set::class -> emptySet() - ArrayList::class -> arrayListOf() - HashMap::class -> hashMapOf() - HashSet::class -> hashSetOf() + List::class -> List(0) {} + Map::class -> HashMap() + Set::class -> HashSet() + ArrayList::class -> ArrayList() + HashMap::class -> HashMap() + HashSet::class -> HashSet() else -> orInstantiateVia() } } -} \ No newline at end of file +} diff --git a/mockk/common/src/test/kotlin/io/mockk/gh/Issue510Test.kt b/mockk/common/src/test/kotlin/io/mockk/gh/Issue510Test.kt new file mode 100644 index 000000000..8845f2b2f --- /dev/null +++ b/mockk/common/src/test/kotlin/io/mockk/gh/Issue510Test.kt @@ -0,0 +1,56 @@ +package io.mockk.gh + +import io.mockk.clearAllMocks +import io.mockk.every +import io.mockk.mockk +import kotlin.test.BeforeTest +import kotlin.test.Test + +data class Product(val name: String, val price: Int) +data class Order(val name: String) + +class ShopService { + + fun buyProducts(products: List) { + println("You bought $products...") + } + + fun addProductAndOrders(products: List, orders: List) { + println("Add $products and $orders...") + } +} + +class TestMockk { + + private val shopService = mockk() + + @BeforeTest + internal fun setUp() { + clearAllMocks() + } + + @Test + internal fun `should match list of arguments`() { // Passes + + every { + shopService.buyProducts(any()) + } returns Unit + val products = listOf(Product("raspberry", 2), Product("banana", 212)) + + shopService.buyProducts(products) + + } + + @Test + internal fun `should match with two arguments of type list`() { // Throws MockkException + + every { + shopService.addProductAndOrders(products = any(), orders = any()) + } returns Unit + + val products = listOf(Product("raspberry", 2), Product("banana", 1)) + val orders = listOf(Order("raspber"), Order("banana")) + + shopService.addProductAndOrders(products, orders) // Throws MockkException + } +} diff --git a/mockk/common/src/test/kotlin/io/mockk/impl/instantiation/AnyValueGeneratorTest.kt b/mockk/common/src/test/kotlin/io/mockk/impl/instantiation/AnyValueGeneratorTest.kt index 38453c328..b45635dd0 100644 --- a/mockk/common/src/test/kotlin/io/mockk/impl/instantiation/AnyValueGeneratorTest.kt +++ b/mockk/common/src/test/kotlin/io/mockk/impl/instantiation/AnyValueGeneratorTest.kt @@ -6,9 +6,9 @@ import kotlin.test.assertEquals import kotlin.test.fail class AnyValueGeneratorTest { - val generator = AnyValueGenerator() + private val generator = AnyValueGenerator() - val failOnPassThrough = { fail("Passed trough") } + private val failOnPassThrough = { fail("Passed trough") } @Test fun givenByteClassWhenRequestedForAnyValueThen0IsReturned() { diff --git a/mockk/jvm/src/main/kotlin/io/mockk/impl/JvmMockKGateway.kt b/mockk/jvm/src/main/kotlin/io/mockk/impl/JvmMockKGateway.kt index a272d7ae0..f3c9b4734 100644 --- a/mockk/jvm/src/main/kotlin/io/mockk/impl/JvmMockKGateway.kt +++ b/mockk/jvm/src/main/kotlin/io/mockk/impl/JvmMockKGateway.kt @@ -55,7 +55,7 @@ class JvmMockKGateway : MockKGateway { instanceFactoryRegistryIntrnl ) - val anyValueGenerator = JvmAnyValueGenerator(instantiator) + val anyValueGenerator = JvmAnyValueGenerator(instantiator.instantiate(Void::class)) val signatureValueGenerator = JvmSignatureValueGenerator(Random()) diff --git a/mockk/jvm/src/main/kotlin/io/mockk/impl/instantiation/JvmAnyValueGenerator.kt b/mockk/jvm/src/main/kotlin/io/mockk/impl/instantiation/JvmAnyValueGenerator.kt index 99fc2fc80..04253b6c9 100644 --- a/mockk/jvm/src/main/kotlin/io/mockk/impl/instantiation/JvmAnyValueGenerator.kt +++ b/mockk/jvm/src/main/kotlin/io/mockk/impl/instantiation/JvmAnyValueGenerator.kt @@ -2,8 +2,9 @@ package io.mockk.impl.instantiation import kotlin.reflect.KClass -class JvmAnyValueGenerator(instantiator: JvmInstantiator) : AnyValueGenerator() { - val voidInstance = instantiator.instantiate(Void::class) +class JvmAnyValueGenerator( + private val voidInstance: Any +) : AnyValueGenerator() { override fun anyValue(cls: KClass<*>, orInstantiateVia: () -> Any?): Any? { return when (cls) { @@ -20,12 +21,12 @@ class JvmAnyValueGenerator(instantiator: JvmInstantiator) : AnyValueGenerator() java.lang.Double::class -> 0.0 java.lang.Class::class -> Object::class.java - java.util.List::class -> listOf() - java.util.Map::class -> mapOf() - java.util.Set::class -> emptySet() - java.util.ArrayList::class -> arrayListOf() - java.util.HashMap::class -> hashMapOf() - java.util.HashSet::class -> hashSetOf() + java.util.List::class -> List(0) {} + java.util.Map::class -> HashMap() + java.util.Set::class -> HashSet() + java.util.ArrayList::class -> ArrayList() + java.util.HashMap::class -> HashMap() + java.util.HashSet::class -> HashSet() else -> super.anyValue(cls) { if (cls.java.isArray) { diff --git a/mockk/jvm/src/main/kotlin/io/mockk/impl/instantiation/JvmInstantiator.kt b/mockk/jvm/src/main/kotlin/io/mockk/impl/instantiation/JvmInstantiator.kt index c03781bac..4d6a880ff 100644 --- a/mockk/jvm/src/main/kotlin/io/mockk/impl/instantiation/JvmInstantiator.kt +++ b/mockk/jvm/src/main/kotlin/io/mockk/impl/instantiation/JvmInstantiator.kt @@ -6,7 +6,7 @@ import io.mockk.proxy.MockKInstantiatior import kotlin.reflect.KClass class JvmInstantiator( - val instantiator: MockKInstantiatior, + private val instantiator: MockKInstantiatior, instanceFactoryRegistry: CommonInstanceFactoryRegistry ) : AbstractInstantiator(instanceFactoryRegistry) { diff --git a/mockk/jvm/src/test/kotlin/io/mockk/jvm/JvmAnyValueGeneratorTest.kt b/mockk/jvm/src/test/kotlin/io/mockk/jvm/JvmAnyValueGeneratorTest.kt index c42f10c41..6167a1cff 100644 --- a/mockk/jvm/src/test/kotlin/io/mockk/jvm/JvmAnyValueGeneratorTest.kt +++ b/mockk/jvm/src/test/kotlin/io/mockk/jvm/JvmAnyValueGeneratorTest.kt @@ -1,6 +1,124 @@ package io.mockk.jvm +import io.mockk.impl.instantiation.JvmAnyValueGenerator +import io.mockk.util.assertArrayEquals +import org.junit.jupiter.api.Test +import kotlin.test.assertEquals +import kotlin.test.fail + class JvmAnyValueGeneratorTest { - // TODO more tests -} \ No newline at end of file + private val generator = JvmAnyValueGenerator("") + + private val failOnPassThrough = { fail("Passed trough") } + + @Test + fun givenByteClassWhenRequestedForAnyValueThen0IsReturned() { + assertEquals(0.toByte(), generator.anyValue(Byte::class, failOnPassThrough)) + } + + @Test + fun givenShortClassWhenRequestedForAnyValueThen0IsReturned() { + assertEquals(0.toShort(), generator.anyValue(Short::class, failOnPassThrough)) + } + + @Test + fun givenCharClassWhenRequestedForAnyValueThen0IsReturned() { + assertEquals(0.toChar(), generator.anyValue(Char::class, failOnPassThrough)) + } + + @Test + fun givenIntClassWhenRequestedForAnyValueThen0IsReturned() { + assertEquals(0, generator.anyValue(Int::class, failOnPassThrough)) + } + + @Test + fun givenLongClassWhenRequestedForAnyValueThen0IsReturned() { + assertEquals(0L, generator.anyValue(Long::class, failOnPassThrough)) + } + + @Test + fun givenFloatClassWhenRequestedForAnyValueThen0IsReturned() { + assertEquals(0F, generator.anyValue(Float::class, failOnPassThrough)) + } + + @Test + fun givenDoubleClassWhenRequestedForAnyValueThen0IsReturned() { + assertEquals(0.0, generator.anyValue(Double::class, failOnPassThrough)) + } + + @Test + fun givenStringClassWhenRequestedForAnyValueThenEmptyStringIsReturned() { + assertEquals("", generator.anyValue(String::class, failOnPassThrough)) + } + + @Test + fun givenBooleanArrayClassWhenRequestedForAnyValueThenEmptyBooleanArrayIsReturned() { + assertArrayEquals(BooleanArray(0), generator.anyValue(BooleanArray::class, failOnPassThrough) as BooleanArray) + } + + @Test + fun givenByteArrayClassWhenRequestedForAnyValueThenEmptyByteArrayIsReturned() { + assertArrayEquals(ByteArray(0), generator.anyValue(ByteArray::class, failOnPassThrough) as ByteArray) + } + + @Test + fun givenCharArrayClassWhenRequestedForAnyValueThenEmptyCharArrayIsReturned() { + assertArrayEquals(CharArray(0), generator.anyValue(CharArray::class, failOnPassThrough) as CharArray) + } + + @Test + fun givenShortArrayClassWhenRequestedForAnyValueThenEmptyShortArrayIsReturned() { + assertArrayEquals(ShortArray(0), generator.anyValue(ShortArray::class, failOnPassThrough) as ShortArray) + } + + @Test + fun givenIntArrayClassWhenRequestedForAnyValueThenEmptyIntArrayIsReturned() { + assertArrayEquals(IntArray(0), generator.anyValue(IntArray::class, failOnPassThrough) as IntArray) + } + + @Test + fun givenLongArrayClassWhenRequestedForAnyValueThenEmptyLongArrayIsReturned() { + assertArrayEquals(LongArray(0), generator.anyValue(LongArray::class, failOnPassThrough) as LongArray) + } + + @Test + fun givenFloatArrayClassWhenRequestedForAnyValueThenEmptyFloatArrayIsReturned() { + assertArrayEquals(FloatArray(0), generator.anyValue(FloatArray::class, failOnPassThrough) as FloatArray, 1e-6f) + } + + @Test + fun givenDoubleArrayClassWhenRequestedForAnyValueThenEmptyDoubleArrayIsReturned() { + assertArrayEquals(DoubleArray(0), generator.anyValue(DoubleArray::class, failOnPassThrough) as DoubleArray, 1e-6) + } + + @Test + fun givenListClassWhenRequestedForAnyValueThenEmptyListIsReturned() { + assertEquals(listOf(), generator.anyValue(List::class, failOnPassThrough) as List<*>) + } + + @Test + fun givenMapClassWhenRequestedForAnyValueThenEmptyMapIsReturned() { + assertEquals(mapOf(), generator.anyValue(Map::class, failOnPassThrough) as Map<*, *>) + } + + @Test + fun givenSetClassWhenRequestedForAnyValueThenEmptySetIsReturned() { + assertEquals(setOf(), generator.anyValue(Set::class, failOnPassThrough) as Set<*>) + } + + @Test + fun givenArrayListClassWhenRequestedForAnyValueThenEmptyArrayListIsReturned() { + assertEquals(arrayListOf(), generator.anyValue(ArrayList::class, failOnPassThrough) as ArrayList<*>) + } + + @Test + fun givenHashMapClassWhenRequestedForAnyValueThenEmptyHashMapIsReturned() { + assertEquals(hashMapOf(), generator.anyValue(HashMap::class, failOnPassThrough) as HashMap<*, *>) + } + + @Test + fun givenHashSetClassWhenRequestedForAnyValueThenEmptyHashSetIsReturned() { + assertEquals(hashSetOf(), generator.anyValue(HashSet::class, failOnPassThrough) as HashSet<*>) + } +}