【问题标题】:Kotlin using ArgumentCaptor.capture() returns nullKotlin 使用 ArgumentCaptor.capture() 返回 null
【发布时间】:2023-01-05 23:31:39
【问题描述】:

我对测试很陌生,所以我可能做错了什么。我正在尝试捕获传递给方法的值

    @Mock
    private lateinit var service: TestService


    @InjectMocks
    private lateinit var underTest: UnderTestService

    @org.junit.jupiter.api.Test
        fun `testMethod`() {
            //given
            val var1 = Test.Value
            val var2 = TestClass::class.java
            val var3 = listOf(Entry1(), Entry2())
    
            //when
            underTest.method(var1, var2, var3)
    
            val argumentCaptor = ArgumentCaptor.forClass(String::class.java)
    
            verify(service, times(2)).method(
                argumentCaptor.capture(),
                argumentCaptor.capture()

        )

在这里,在验证 argumentCaptor.capture() 出于某种原因返回 null 之后,我不明白我做错了什么?

java.lang.NullPointerException: argumentCaptor.capture() must not be null

我认为它与 kotlin 相关,我试图获取参数的方法的签名如下所示

    fun method(param1: String, vararg param2: String?) {
            //do something
  }

【问题讨论】:

    标签: kotlin testing mockito


    【解决方案1】:

    MockitoKotlinHelpers.kt 可以在这里帮助你。抓包功能提供了调用ArgumentCaptor.capture()的方法

    例子:

    verify(service, times(2)).method(
                    capture(argumentCaptor),
                    capture(argumentCaptor));
    

    【讨论】:

    • 写那个帮手,和上面的链接一样!并使用它。
    【解决方案2】:

    使用Mockito-Kotlin(官方 Mockito 库)可以为您解决这个问题。

    它在 Mockito 之上添加了一些语法糖。例如,函数 whenever 基本上是 when 的别名,因此您不需要使用带有反引号的 `when`

    它还添加了一个方法 argumentCaptor(),它创建了一个没有 NullPointerException 问题的参数捕获器。用法示例:

    val argumentCaptor = argumentCaptor<String>()
    
    verify(service, times(2)).method(
        argumentCaptor.capture(),
        argumentCaptor.capture(),
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 2022-01-03
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多