Spock 和内部 kotlin 函数
Spock and internal kotlin function
我在 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()
}
和我的 MonetaryPreconditions class:
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: No signature of method: touk.recruitment.parkandrest.parkingmanagement.core.monetary.MonetaryPreconditions.checkMonetariesCurrencies() is applicable for argument types: (touk.recruitment.parkandrest.parkingmanagement.core.monetary.Monetary, touk.recruitment.parkandrest.parkingmanagement.core.monetary.Monetary) values: [touk.recruitment.parkandrest.parkingmanagement.core.monetary.Monetary@7c417213, ...]
问题在于我的 checkMonetariesCurrencies 函数的内部可见性。如果我将它更改为 public 它工作得很好,但我确实希望它是模块私有的。我如何使用 Spock 实现这一目标?
关于我的项目的其他信息:
- 测试 class 和 MonetaryPreconditions 具有相同的包。
- 我正在使用 Maven。
- 测试 class 和 MonetaryPreconditions 当然在同一个模块中。
我只是 运行 遇到了同样的问题,我使用的解决方法(由我的一位经验丰富的同事建议)是在 Kotlin 中编写一个包装器 class(与class under test (CUT);我将源代码文件放在 test/kotlin
文件夹中),然后将函数调用转发给 CUT。然后我在 groovy 单元测试代码中使用了包装器 class。
此外,从另一种编程语言调用 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)
谢谢朱塞佩的回答。但是对我来说,Spock 没有看到包装器,因为它认为它是测试 class 的 属性 并抛出了一个 groovy.lang.MissingPropertyException
。我已将此添加到 build.gradle:
compileTestGroovy.classpath += files(compileTestKotlin.destinationDir)
取自此处:https://localcoder.org/test-classes-in-groovy-dont-see-test-classes-in-kotlin
我在 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()
}
和我的 MonetaryPreconditions class:
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: No signature of method: touk.recruitment.parkandrest.parkingmanagement.core.monetary.MonetaryPreconditions.checkMonetariesCurrencies() is applicable for argument types: (touk.recruitment.parkandrest.parkingmanagement.core.monetary.Monetary, touk.recruitment.parkandrest.parkingmanagement.core.monetary.Monetary) values: [touk.recruitment.parkandrest.parkingmanagement.core.monetary.Monetary@7c417213, ...]
问题在于我的 checkMonetariesCurrencies 函数的内部可见性。如果我将它更改为 public 它工作得很好,但我确实希望它是模块私有的。我如何使用 Spock 实现这一目标?
关于我的项目的其他信息:
- 测试 class 和 MonetaryPreconditions 具有相同的包。
- 我正在使用 Maven。
- 测试 class 和 MonetaryPreconditions 当然在同一个模块中。
我只是 运行 遇到了同样的问题,我使用的解决方法(由我的一位经验丰富的同事建议)是在 Kotlin 中编写一个包装器 class(与class under test (CUT);我将源代码文件放在 test/kotlin
文件夹中),然后将函数调用转发给 CUT。然后我在 groovy 单元测试代码中使用了包装器 class。
此外,从另一种编程语言调用 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)
谢谢朱塞佩的回答。但是对我来说,Spock 没有看到包装器,因为它认为它是测试 class 的 属性 并抛出了一个 groovy.lang.MissingPropertyException
。我已将此添加到 build.gradle:
compileTestGroovy.classpath += files(compileTestKotlin.destinationDir)
取自此处:https://localcoder.org/test-classes-in-groovy-dont-see-test-classes-in-kotlin