【问题标题】:Spock and internal kotlin functionSpock 和内部 kotlin 函数
【发布时间】:2018-09-07 09:16:23
【问题描述】:

我在 Spock 测试中使用内部 kotlin 函数时遇到问题。这是我的 spock 测试的简短 sn-p:

private def preconditions = new MonetaryPreconditions()
private def usdMonetary = new Monetary(BigDecimal.ZERO, Currency.USD)

def "should throw nothing because Monetaries currencies are same"(){
    when:
    preconditions.checkMonetariesCurrencies(usdMonetary , usdMonetary )
    then:
    noExceptionThrown()
}

还有我的 MonetaryPreconditions 类:

internal object MonetaryPreconditions {

  internal fun checkMonetariesCurrencies(monetary1: Monetary, monetary2: Monetary) {
    if (monetary1.currency != monetary2.currency) {
        throw CurrencyMismatchException(arrayOf(monetary1.currency, monetary2.currency), "Compared currencies does not match: " + monetary1.currency
                + " , " + monetary2.currency)
    }
  }

}

我的测试因堆栈跟踪而失败:

groovy.lang.MissingMethodException:没有方法签名:touk.recruitment.parkandrest.parkingmanagement.core.monetary.MonetaryPreconditions.checkMonetariesCurrencies() 适用于参数类型:(touk.recruitment.parkandrest.parkingmanagement.core.monetary.货币,touk.recruitment.parkandrest.parkingmanagement.core.monetary.Monetary) 值:[touk.recruitment.parkandrest.parkingmanagement.core.monetary.Monetary@7c417213, ...]

问题在于我的 checkMonetariesCurrencies 函数的内部可见性。如果我将其更改为 public,它就可以正常工作,但是我确实希望它是模块私有的。如何使用 Spock 实现这一目标?

关于我的项目的其他信息:

  • 测试类和 MonetaryPreconditions 具有相同的包。
  • 我正在使用 Maven。
  • 测试类和 MonetaryPreconditions 当然在同一个模块中。

【问题讨论】:

    标签: kotlin spock


    【解决方案1】:

    我刚刚遇到了同样的问题,我使用的解决方法(由我的一位经验丰富的同事建议)是在 Kotlin 中编写一个包装类(与被测类 (CUT) 在同一个包中;我将test/kotlin 文件夹中的源代码文件),然后将函数调用转发到 CUT。然后我在我的 groovy 单元测试代码中使用了包装类。

    此外,从另一种编程语言调用 Kotlin 中 object 中定义的函数需要您访问对象的 INSTANCE 变量,例如

    MonetaryPreconditions.INSTANCE.myfunction
    

    在您的情况下,包装器可能如下所示:

    package com.yourpackage
    
    object MonetaryPreconditionsWrapper{
        fun checkMonetariesCurrencies(monetary1: Monetary, monetary2: Monetary){
            MonetaryPreconditions.checkMonetariesCurrencies(monetary1, monetary2)
        }
    }
    

    现在您可以通过简单地从 groovy 代码中调用包装函数来测试 MonetaryPreconditions.checkMonetariesCurrencies 函数,如下所示:

    MonetaryPreconditionsWrapper.INSTANCE.checkMonetariesCurrencies(monetary1, monetary2)
    

    【讨论】:

      猜你喜欢
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 2021-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多