You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中Mockito测试报错:Mockito.isA(Pageable::class.java)不能为空

解决Mockito测试中Mockito.isA(...) must not be null的错误

我来帮你拆解一下这个问题,你遇到的错误和测试代码里的几个小问题都很典型:

1. 直接错误原因:Kotlin空安全与Mockito匹配器的冲突

在Kotlin中,Mockito.isA(Class<T>)方法返回的是可空类型T?,但你的OrganizationRepository.findByArchived方法的第二个参数是非空的Pageable。当你把isA的结果作为参数传给这个方法时,Kotlin的空安全检查会判定这个值可能为null,从而抛出IllegalStateException提示你“must not be null”。

2. 测试代码里的其他逻辑问题

  • 你在测试最后写了assertNotNull(exc),这意味着你期望测试执行时抛出异常,但实际上这个测试用例的逻辑是验证“归档状态查询无数据返回”的正常流程,应该不抛出异常,这是断言逻辑的错误。
  • 你已经通过@Mock注解初始化了mockPageable,但在测试方法里又重新创建了mockPageableObj,属于冗余代码。

修正后的测试代码

下面是修复后的完整测试用例,我去掉了不必要的try-catch(JUnit会自动处理异常),替换了匹配器,修正了断言逻辑:

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)
    }

    @Test
    fun testListAll_Archived_NoOrgsReturned() {
        val archived = true
        val organizationList = LinkedList<Organization>()
        val returnedPage = PageImpl(organizationList)

        // 用any()替代isA(),避免空安全问题
        Mockito.`when`(mockOrganizationRepository.findByArchived(Mockito.anyBoolean(), Mockito.any(Pageable::class.java)))
            .thenReturn(returnedPage)

        val organizationPage = organizationServiceImpl.listAll(mockPageable, archived)

        assertNotNull(organizationPage)
        assertTrue(organizationPage.size == returnedPage.size)
        Mockito.verify(mockOrganizationRepository, Mockito.times(1))
            .findByArchived(Mockito.anyBoolean(), Mockito.any(Pageable::class.java))
    }
}

关键修复点说明

  • 用Mockito.any(Pageable::class.java)替换Mockito.isA(Pageable::class.java):any()在Kotlin中会适配非空参数的场景,避免空安全报错。如果你确实需要匹配特定类型(而不是任意对象),也可以用Mockito.isA(Pageable::class.java)!!强制非空,但any()更符合这个测试场景的需求。
  • 移除了try-catch块:JUnit会自动捕获测试中的异常并标记测试失败,手动捕获反而会掩盖真实问题。
  • 修正了断言逻辑:去掉了错误的assertNotNull(exc),确保测试验证的是正常流程的正确性。
  • 使用了已通过@Mock初始化的mockPageable,去掉了冗余的mockPageableObj创建。

内容的提问来源于stack exchange,提问作者Damien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:52:12