简体   繁体   中英

Kotlin - Mockito Test Failing

I have the following method in my kotlin code base

package com.service.organization

import com.domain.Organization
import com.repository.organization.OrganizationRepository
import org.springframework.data.domain.Page
import org.springframework.data.domain.Pageable
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional

interface OrganizationService {
    fun listAll(pageable : Pageable , archived : Boolean?) : Page<Organization>
}

@Service
internal class OrganizationServiceImpl(private val organizationRepository : OrganizationRepository) : OrganizationService {

    @Transactional(readOnly = true)
    override fun listAll(pageable : Pageable , archived : Boolean?) : Page<Organization> {
        val organizations : Page<Organization>
        if (archived !== null) {
            organizations = organizationRepository.findByArchived(archived , pageable)
        } else {
            organizations = organizationRepository.findAll(pageable)
        }
        return organizations
    }
}

I have the following test to test out the archived flow

package com.service.organization

import com.domain.Organization
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.junit.MockitoJUnitRunner
import org.springframework.data.domain.PageImpl
import org.springframework.data.domain.Pageable
import java.util.*

@RunWith(MockitoJUnitRunner::class)
class OrganizationServiceTest {

    @Mock
    lateinit var mockOrganizationRepository: OrganizationRepository

    @Mock
    lateinit var mockPageable: Pageable

    internal lateinit var organizationServiceImpl: OrganizationServiceImpl

    @Before
    fun setUp() {
        organizationServiceImpl = OrganizationServiceImpl(mockOrganizationRepository)
        //mockPageable = Mockito.mock(Pageable::class.java)
    }

    @Test
    fun testListAll_Archived_NoOrgsReturned() {
        val archived = true
        var mockPageableObj = Mockito.mock(Pageable::class.java)
        val organizationList = LinkedList<Organization>()
        val returnedPage = PageImpl(organizationList)

        var exc: Exception? = null
        try {
            Mockito.`when`(mockOrganizationRepository.findByArchived(Mockito.anyBoolean(), Mockito.isA(Pageable::class.java))).thenReturn(returnedPage)

            val organizationPage = organizationServiceImpl.listAll(mockPageableObj, archived)
            assertNotNull(organizationPage)
            assertTrue(organizationPage.size == returnedPage.size)

            Mockito.verify(mockOrganizationRepository, Mockito.times(1)).findByArchived(Mockito.anyBoolean(), Mockito.isA(Pageable::class.java))
        } catch(e: Exception) {
            exc = e
            exc.printStackTrace()
        }
        assertNotNull(exc)
    }

}

However when I run that test - I get the following error

[INFO] Running com.service.organization.OrganizationServiceTest
     java.lang.IllegalStateException: Mockito.isA(Pageable::class.java) must not be null
     at com.service.organization.OrganizationServiceTest.testListAll_Archived_NoOrgsReturned(OrganizationServiceTest.kt:139)
     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
     at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
     at java.base/java.lang.reflect.Method.invoke(Method.java:567)
     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
     at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
     at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
     at org.mockito.internal.runners.DefaultInternalRunner$1.run(DefaultInternalRunner.java:79)
     at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:85)
     at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:39)
     at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163)
     at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:365)
     at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:273)
     at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:238)
     at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:159)
     at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:384)
     at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:345)
     at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:126)
     at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:418)

Does anyone have any idea what I am doing wrong here?

Thanks in advance

I didnt use a matcher but used the specific value for the method call.

UPDATE

This medium post also highlights a valid solution where you can pass an any() matcher https://medium.com/@elye.project/befriending-kotlin-and-mockito-1c2e7b0ef791

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM