MockK:模拟jpa repository.save调用

问题描述

我要测试的代码将对象保存到数据库中并保存了一些要点,但是我不需要对此进行测试。 所以我想模拟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