【问题标题】:MockK: mocking an jpa repository.save callMockK:模拟 jpa repository.save 调用
【发布时间】:2020-10-14 10:01:50
【问题描述】:

我的测试代码将对象保存到数据库和一些点,但我不需要对此进行测试。 所以我想模拟 Repository.save 方法。但是save 方法返回保存的对象。 我尝试了以下方法:

@MockK
private lateinit var mockJobRepository: JobRepository
val jobSlot = slot<Job>()
// ...
every { mockJobRepository.save<Job>(capture(jobSlot)) } 
    returns(jobSlot.captured)

但它会引发运行时错误: "捕获的lateinit属性尚未初始化"

如何在模拟中返回给定的参数?

【问题讨论】:

    标签: kotlin mockk


    【解决方案1】:

    你试过了吗

    private val mockJobRepository = mockk<JobRepository>()
    

    ?

    我注意到lateinit vars 上的@Mockk 注释可能很挑剔

    【讨论】:

      【解决方案2】:

      当使用注解时,你必须在某个时候告诉 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-05
        • 1970-01-01
        • 2019-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多