当前位置: 首页 > 知识库问答 >
问题:

Spock和内kotlin函数

墨翔宇
2023-03-14

我在Spock测试中使用内部kotlin函数时遇到了麻烦。以下是我的spock测试的简短片段:

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()
}
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)
    }
  }

}

我的测试以StackTrace失败:

groovy.lang.missingmethodException:方法:touk.recruitment.parkandrest.parkingmanagement.core.monetary.monetarypreconditions.checkmonetariesCencurrences()的无签名适用于参数类型:(touk.recruitment.parkandrest.parkandrest.parkingmanagement.core.monetariesCencurrency,

问题在于CheckMonetariesCencurrences函数的内部可见性。如果我把它改成公共的,它工作得很好,但是我希望它是模块私有的。我怎么能用斯波克做到这一点?

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

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

共有1个答案

单于飞鸣
2023-03-14

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

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

MonetaryPreconditions.INSTANCE.myfunction

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

package com.yourpackage

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

现在,您可以测试MonetaryPreconditions.CheckMonetariesCencurrences函数,方法是从groovy代码中调用包装器函数,如下所示:

MonetaryPreconditionsWrapper.INSTANCE.checkMonetariesCurrencies(monetary1, monetary2)
 类似资料:
  • 例外情况。kt: 在科特林: 它在kotlin中工作,函数是内联的。 但是当在Java代码中使用时,它就是不能内联,仍然是一个正常的静态方法调用(从反编译的内容中可以看出)。 像这样的东西:

  • 本文向大家介绍Kotlin中内置函数的用法和区别总结,包括了Kotlin中内置函数的用法和区别总结的使用技巧和注意事项,需要的朋友参考一下 前言 在Kotlin中的源码标准库(Standard.kt)中提供了一些Kotlin扩展的内置函数可以优化kotlin的编码。Standard.kt是Kotlin库的一部分,它定义了一些基本函数。 这个源代码文件虽然一共不到50行代码,但是这些函数功能都非常强

  • 本文向大家介绍kotlin Standard中的内联函数示例详解,包括了kotlin Standard中的内联函数示例详解的使用技巧和注意事项,需要的朋友参考一下 let、with、run、apply、also、takeIf、takeUnless、repeat函数的使用 kotlin Standard.kt文件中,提供了一些内联函数,这些内联函数可以减少代码量,在使代码优美的同时,打打提高开发效率

  • 我试图理解正确使用的功能(运行,与,让,也,应用)。假设我们有以下初始代码(我将其用于测试目的): 根据这张图片,我将其修改为: 但根据我找到的一些指南,我认为我在那里做了多项“工作” 修改初始con对象 所以,我觉得这更正确: 这些职能是否严格分开 是否有关于如何使用这些功能的指南(官方或非官方)?

  • 我在理解GEB/Spock测试中的一个问题时遇到了一些困难。我们正在使用gradle,并试图并行运行我们的测试。据我所知,gradle中的maxParallelForks属性将在单独的JVM中运行测试类。 我遇到的问题是,当我有6个测试类并将maxParallelForks设置为4个时,当测试开始时,我将得到4个测试类并行运行。太棒了!但最后两个班才是问题所在。假设在前4节课中,2节课在1分钟内完

  • 斯波克行为怪异