问题描述
作为标题!我无法运行任何使用MockK的测试,因为它们最终在初始化期间引发了StackOverflowError。
作为示例,这是我的测试类之一:
Exception in thread "Test worker" java/lang/StackOverflowError
at io/mockk/proxy/jvm/dispatcher/JvmMockKdispatcher.get (JvmMockKdispatcher.java:16)
at java/lang/Object.hashCode (Object.java:119)
at java/util/HashMap.hash (HashMap.java:339)
at java/util/HashMap.get (HashMap.java:557)
at sun/reflect/Reflection.filterMethods (Reflection.java:291)
at java/lang/Class.getmethodHelper (Class.java:1265)
at java/lang/Class.getmethod (Class.java:1191)
at java/lang/Object.hashCode (Object.java:119)
at java/util/HashMap.hash (HashMap.java:339)
at java/util/HashMap.get (HashMap.java:557)
at sun/reflect/Reflection.filterMethods (Reflection.java:291)
at java/lang/Class.getmethodHelper (Class.java:1265)
at java/lang/Class.getmethod (Class.java:1191)
at java/lang/Object.hashCode (Object.java:119)
at java/util/HashMap.hash (HashMap.java:339)
at java/util/HashMap.get (HashMap.java:557)
at sun/reflect/Reflection.filterMethods (Reflection.java:291)
at java/lang/Class.getmethodHelper (Class.java:1265)
at java/lang/Class.getmethod (Class.java:1191)
at java/lang/Object.hashCode (Object.java:119)
at java/util/HashMap.hash (HashMap.java:339)
at java/util/HashMap.get (HashMap.java:557)
...
这是产生的堆栈跟踪,一旦模式变得明显,就将其切断:
org.gradle.internal.remote.internal.MessageIOException: Could not read message from '/127.0.0.1:52775'.
at org.gradle.internal.remote.internal.inet.socketConnection.receive(SocketConnection.java:94)
at org.gradle.internal.remote.internal.hub.MessageHub$ConnectionReceive.run(MessageHub.java:270)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
at java.lang.Thread.run(Thread.java:821)
然后会引发MessageIOException:
dependencies {
// Other dependencies go here...
testImplementation("org.springframework.boot:spring-boot-starter-test") {
exclude(group = "org.junit.vintage",module = "junit-vintage-engine")
}
testImplementation("org.springframework.security:spring-security-test")
testImplementation("org.jetbrains.kotlin:kotlin-test-junit5:1.4.10")
testImplementation("io.mockk:mockk:1.10.2")
testImplementation("com.ninja-squad:springmockk:2.0.3")
}
据我所知,我已经正确设置了MockK并根据其指南进行使用:
cimg/openjdk:8.0
是什么导致该异常,我该如何解决?让我知道是否需要更多上下文。
编辑:CircleCI使用图像DBSequence
编辑2:添加了DBSequenceRepo
和@Document(collection = "dbSequences")
data class DBSequence(
@Id var name: String,var nextVal: Long
) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as DBSequence
if (name != other.name) return false
return true
}
override fun hashCode(): Int {
return name.hashCode()
}
}
interface DBSequencesRepo : MongoRepository<DBSequence,String>
的定义
{{1}}
解决方法
对我来说,我收到以下错误:
at java/lang/Class.getMethod (java.base@9/Class.java:1361)
at java/lang/Object.hashCode (java.base@9/Object.java:122)
at java/util/HashMap.hash (java.base@9/HashMap.java:339)
at java/util/HashMap.get (java.base@9/HashMap.java:552)
at jdk/internal/reflect/Reflection.filterMethods (java.base@9/Reflection.java:276)
at java/lang/Class.getMethodHelper (java.base@9/Class.java:1457)
at java/lang/Class.getMethod (java.base@9/Class.java:1361)
at java/lang/Object.hashCode (java.base@9/Object.java:122)
at java/util/HashMap.hash (java.base@9/HashMap.java:339)
at java/util/HashMap.get (java.base@9/HashMap.java:552)
at jdk/internal/reflect/Reflection.filterMethods (java.base@9/Reflection.java:276)
at java/lang/Class.getMethodHelper (java.base@9/Class.java:1457)
at java/lang/Class.getMethod (java.base@9/Class.java:1361)
at java/lang/Object.hashCode (java.base@9/Object.java:122)
at java/util/HashMap.hash (java.base@9/HashMap.java:339)
at java/util/HashMap.get (java.base@9/HashMap.java:552)`
事实证明,mockK 库无法在特定版本的 Java 11(特别是 11.0.10.j9-adpt
)上运行
如果您使用的是 sdkman,请使用 11.0.10.hs-adpt
版本
| | 11.0.10.j9 | adpt | | 11.0.10.j9-adpt
| >>> | 11.0.10.hs | adpt | installed | 11.0.10.hs-adpt
存在与该问题有关的open issue in mockk。该错误在JVM变体的一部分上重现。我想您本地有这样的JVM安装之一。解决方法是,您可以尝试在本地安装其他JVM发行版。根据上面的链接,“ AdoptOpenJDK:1.8.0_222热点”似乎还可以。
,我们今天在本地计算机上遇到了类似的问题。我们正在尝试将MockK与vert.x和Kotlin一起用于后端服务。
我们的开发机器是具有OpenJDK 11.0.9的MacO,并且出于某些奇怪的原因,有时可以正常运行,有时可以保持活动状态,直到引发测试超时并显示以下消息:
per (java.base@9/Class.java:1457)
at java/lang/Class.getMethod (java.base@9/Class.java:1361)
at java/lang/Object.hashCode (java.base@9/Object.java:122)
at java/util/HashMap.hash (java.base@9/HashMap.java:339)
at java/util/HashMap.get (java.base@9/HashMap.java:552)
at jdk/internal/reflect/Reflection.filterMethods (java.base@9/Reflection.java:276)
at java/lang/Class.getMethodHelper (java.base@9/Class.java:1457)
at java/lang/Class.getMethod (java.base@9/Class.java:1361)
at java/lang/Object.hashCode (java.base@9/Object.java:122)
at java/util/HashMap.hash (java.base@9/HashMap.java:339)
at java/util/HashMap.get (java.base@9/HashMap.java:552)
at jdk/internal/reflect/Reflection.filterMethods (java.base@9/Reflection.java:276)
at java/lang/Class.getMethodHelper (java.base@9/Class.java:1457)
at java/lang/Class.getMethod (java.base@9/Class.java:1361)
at java/lang/Object.hashCode (java.base@9/Object.java:122)
at java/util/HashMap.hash (java.base@9/HashMap.java:339)
at java/util/HashMap.get (java.base@9/HashMap.java:552)
at jdk/internal/reflect/Reflection.filterMethods (java.base@9/Reflection.java:276)
at java/lang/Class.getMethodHelper (java.base@9/Class.java:1457)
at java/lang/Class.getMethod (java.base@9/Class.java:1361)
at java/lang/Object.hashCode (java.base@9/Object.java:122)
at java/util/HashMap.hash (java.base@9/HashMap.java:339)
at java/util/HashMap.get (java.base@9/HashMap.java:552)
at jdk/internal/reflect/Reflection.filterMethods (java.base@9/Reflection.java:276)
at java/lang/Class.getMethodHelper (java.base@9/Class.java:1457)
at java/lang/Class.getMethod (java.base@9/Class.java:1361)
at java/lang/Object.hashCode (java.base@9/Object.java:122)
at java/util/HashMap.hash (java.base@9/HashMap.java:339)
at java/util/HashMap.get (java.base@9/HashMap.java:552)
at jdk/internal/reflect/Reflection.filterMethods (java.base@9/Reflection.java:276)
at java/lang/Class.getMethodHelper (java.base@9/Class.java:1457)
at java/lang/Class.getMethod (java.base@9/Class.java:1361)
at java/lang/Object.hashCode (java.base@9/Object.java:122)
at java/util/HashMap.hash (java.base@9/HashMap.java:339)
at java/util/HashMap.get (java.base@9/HashMap.java:552)
at jdk/internal/reflect/Reflection.filterMethods (java.base@9/Reflection.java:276)
at java/lang/Class.getMethodHelper (java.base@9/Class.java:1457)
at java/lang/Class.getMethod (java.base@9/Class.java:1361)
at java/lang/Object.hashCode (java.base@9/Object.java:122)
at java/util/HashMap.hash (java.base@9/HashMap.java:339)
at java/util/HashMap.get (java.base@9/HashMap.java:552)
at jdk/internal/reflect/Reflection.filterMethods (java.base@9/Reflection.java:276)
at java/lang/Class.getMethodHelper (java.base@9/Class.java:1457)
at java/lang/Class.getMethod (java.base@9/Class.java:1361)
at java/lang/Object.hashCode (java.base@9/Object.java:122)
at java/util/HashMap.hash (java.base@9/HashMap.java:339)
at java/util/HashMap.get (java.base@9/HashMap.java:552)
at jdk/internal/reflect/Reflection.filterMethods (java.base@9/Reflection.java:276)
at java/lang/Class.getMethodHelper (java.base@9/Class.java:1457)
at java/lang/Class.getMethod (java.base@9/Class.java:1361)
at java/lang/Object.hashCode (java.base@9/Object.java:122)
at java/util/HashMap.hash (java.base@9/HashMap.java:339)
at java/util/HashMap.get (java.base@9/HashMap.java:552)
at jdk/internal/reflect/Reflection.filterMethods (java.base@9/Reflection.java:276)
at java/lang/Class.getMethodHelper (java.base@9/Class.java:1457)
at java/lang/Class.getMethod (java.base@9/Class.java:1361)
at java/lang/Object.hashCode (java.base@9/Object.java:122)
at java/util/HashMap.hash (java.base@9/HashMap.java:339)
at java/util/HashMap.get (java.base@9/HashMap.java:552)
at jdk/internal/reflect/Reflection.filterMethods (java.base@9/Reflection.java:276)
at java/lang/Class.getMethodHelper (java.base@9/Class.java:1457)
at java/lang/Class.getMethod (java.base@9/Class.java:1361)
at java/lang/Object.hashCode (java.base@9/Object.java:122)
at java/util/HashMap.hash (java.base@9/HashMap.java:339)
at java/util/HashMap.get (java.base@9/HashMap.java:552)
at jdk/internal/reflect/Reflection.filterMethods (java.base@9/Reflection.java:276)
at java/lang/Class.getMethodHelper (java.base@9/Class.java:1457)
at java/lang/Class.getMethod (java.base@9/Class.java:1361)
at java/lang/Object.hashCode (java.base@9/Object.java:122)
at java/util/HashMap.hash (java.base@9/HashMap.java:339)
at java/util/HashMap.get (java.base@9/HashMap.java:552)
at jdk/internal/
当我们将JDK设置为Idea项目的settins和Gradle中的值为8. *时,有时会通过一个测试,而一个测试却失败,并显示与上述相同的错误。
我不是MockK库的专家,但我非常有兴趣将其与mockito-kotlin进行比较。 与最新版本的JDK一起使用时,IMO库在反射方面存在一些问题。