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
相关产品推荐
相关产品推荐

