问题描述
我要测试的代码将对象保存到数据库中并保存了一些要点,但是我不需要对此进行测试。
所以我想模拟Repository.save方法。但是save
方法返回保存的对象。
我尝试了以下方法:
@MockK
private lateinit var mockJobRepository: JobRepository
val jobSlot = slot<Job>()
// ...
every { mockJobRepository.save<Job>(capture(jobSlot)) }
returns(jobSlot.captured)
但是会引发运行时错误: “捕获的lateinit属性尚未初始化”
如何仅在模拟中返回给定参数?
解决方法
你试过了吗
private val mockJobRepository = mockk<JobRepository>()
?
我注意到lateinit vars 上的@Mockk 注释可能很挑剔
,当使用注解时,你必须在某个时候告诉 Mockk 来初始化注解的属性。假设您使用的是 JUnit 5,您可以通过在 @BeforeEach 中初始化模拟来实现:
class Test {
@MockK
private lateinit var emailService: EmailService
@BeforeEach
fun setUp() {
MockKAnnotations.init(this)
}
}
...或者只是使用 JUnit 的 Mockk-Extension:
@ExtendWith(MockKExtension::class)
class Test {
@MockK
private lateinit var emailService: EmailService
}
顺便说一句。比捕获参数更简洁的选项是 returnsArgument
:
every { mockJobRepository.save<Job>(any()) } returnsArgument 0