首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java.lang.RuntimeException:不支持:类org.spockframework.gentyref.CaptureTypeImpl

java.lang.RuntimeException:不支持:类org.spockframework.gentyref.CaptureTypeImpl
EN

Stack Overflow用户
提问于 2022-03-28 20:54:59
回答 2查看 383关注 0票数 1

Spock用于在Spring项目(2.1.18.RELEASE)中执行集成测试。当我使用1.3-groovy-2.5运行时,会得到以下错误:

代码语言:javascript
运行
复制
Caused by: java.lang.RuntimeException: not supported: class org.spockframework.gentyref.CaptureTypeImpl
    at org.spockframework.gentyref.GenericTypeReflector.erase(GenericTypeReflector.java:33)
    at org.spockframework.mock.runtime.StaticMockMethod.getReturnType(StaticMockMethod.java:50)
    at org.spockframework.mock.EmptyOrDummyResponse.respond(EmptyOrDummyResponse.java:68)
    at org.spockframework.mock.runtime.MockController.handle(MockController.java:50)
    at org.spockframework.mock.runtime.JavaMockInterceptor.intercept(JavaMockInterceptor.java:72)
    at org.spockframework.mock.runtime.ByteBuddyInterceptorAdapter.interceptNonAbstract(ByteBuddyInterceptorAdapter.java:35)
    at com.foo.controller.ConversionsController.createConversionJob(ConversionsController.java:68)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    ... 18 more

如果我把斯波克更新到更新的版本(例如。2.1-groovy-2.5)我得到这个错误:

代码语言:javascript
运行
复制
[ERROR] org.apache.maven.surefire.booter.SurefireBooterForkException: There was an error in the forked process
[ERROR] java.util.ServiceConfigurationError: org.junit.platform.engine.TestEngine: org.spockframework.runtime.SpockEngine Unable to get public no-arg constructor
[ERROR]     at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:733)
[ERROR]     at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:305)
[ERROR]     at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:265)
[ERROR]     at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1314)
[ERROR]     at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1159)
[ERROR]     at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:932)
[ERROR]     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
[ERROR]     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
[ERROR]     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
[ERROR]     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
[ERROR]     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
[ERROR]     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
[ERROR]     at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
[ERROR]     at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
[ERROR]     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
[ERROR]     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
[ERROR]     at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
[ERROR]     at org.apache.maven.cli.MavenCli.execute(MavenCli.java:957)
[ERROR]     at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:289)
[ERROR]     at org.apache.maven.cli.MavenCli.main(MavenCli.java:193)
[ERROR]     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR]     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[ERROR]     at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ERROR]     at java.base/java.lang.reflect.Method.invoke(Method.java:566)
[ERROR]     at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
[ERROR]     at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
[ERROR]     at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
[ERROR]     at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)

我使用的是Java 11和Maven 3.6.3。我的pom.xml相当长,所以我将其简化为一些关注版本和测试依赖关系的片段:

代码语言:javascript
运行
复制
        <properties>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
                <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
                <java.version>11</java.version>
                <bytebuddy.version>1.11.0</bytebuddy.version>
                <cglib.version>3.2.12</cglib.version>
                <gmavenplus.version>1.12.0</gmavenplus.version>
                <groovy.version>2.5.15</groovy.version>
                <objenesis.version>3.2</objenesis.version>
                <spock.version>1.3-groovy-2.5</spock.version>
                <maven.buildhelper.version>3.3.0</maven.buildhelper.version>
                <maven.jacoco.version>0.8.7</maven.jacoco.version>
                <maven.surefire.version>3.0.0-M5</maven.surefire.version>
                <maven.failsafe.version>3.0.0-M5</maven.failsafe.version>
        </properties>

                <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-test</artifactId>
                        <scope>test</scope>
                        <exclusions>
                                <exclusion>
                                        <groupId>com.vaadin.external.google</groupId>
                                        <artifactId>android-json</artifactId>
                                </exclusion>
                        </exclusions>
                </dependency>
                <dependency>
                        <groupId>org.spockframework</groupId>
                        <artifactId>spock-core</artifactId>
                        <scope>test</scope>
                </dependency>
                <!-- uncommented for 2.1-groovy-2.5 -->
                <!-- dependency>
                        <groupId>org.spockframework</groupId>
                        <artifactId>spock-junit4</artifactId>
                        <scope>test</scope>
                </dependency -->
                <dependency>
                        <groupId>org.spockframework</groupId>
                        <artifactId>spock-spring</artifactId>
                        <scope>test</scope>
                </dependency>
                <dependency> <!-- enables mocking of classes (in addition to interfaces) -->
                        <groupId>net.bytebuddy</groupId>
                        <artifactId>byte-buddy</artifactId>
                        <version>${bytebuddy.version}</version>
                        <scope>test</scope>
                </dependency>
                <dependency> <!-- enables mocking of classes without default constructor (together with ByteBuddy or CGLIB) -->
                        <groupId>org.objenesis</groupId>
                        <artifactId>objenesis</artifactId>
                        <version>${objenesis.version}</version>
                        <scope>test</scope>
                </dependency>

                       <plugin>
                                <!-- The gmavenplus plugin is used to compile Groovy code. To learn more about this plugin,
                                     visit https://github.com/groovy/GMavenPlus/wiki -->
                                <groupId>org.codehaus.gmavenplus</groupId>
                                <artifactId>gmavenplus-plugin</artifactId>
                                <version>${gmavenplus.version}</version>
                                <executions>
                                        <execution>
                                                <goals>
                                                        <goal>compile</goal>
                                                        <goal>compileTests</goal>
                                                </goals>
                                        </execution>
                                </executions>
                                <configuration>
                                        <targetBytecode>11</targetBytecode>
                                </configuration>
                        </plugin>

任何帮助,排除这一点,是非常感谢。我根据spock框架项目中的示例对我的pom.xml进行了建模:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-28 21:40:24

关于java.util.ServiceConfigurationError: org.junit.platform.engine.TestEngine: org.spockframework.runtime.SpockEngine Unable to get public no-arg constructor

Spring 2.1.18.RELEASE非常老,它将JUnit 5管理到5.3.2,而Spock 2.x则需要>= 5.8。如果无法将Spring升级到更新的版本,可以尝试设置<junit-jupiter.version>5.8.1</junit-jupiter.version>

至于类型反射错误,我们不能说太多,因为您没有共享任何代码。只有com.foo.controller.ConversionsController.createConversionJob(ConversionsController.java:68)可能有一些奇怪的泛型,或者正在调用一些确实存在的东西。

票数 2
EN

Stack Overflow用户

发布于 2022-03-30 03:39:16

我接受了Leonard Brünings的回答,因为它为我指明了正确的方向,但我想对问题的原因补充更多的解释。

java.lang.RuntimeException: not supported: class org.spockframework.gentyref.CaptureTypeImpl是一个反射错误,它指示要模拟的方法有问题。

异常指出,它无法确定正在调用的存根方法的正确响应类型

我有一个这样的方法:

代码语言:javascript
运行
复制
public class Foo {

    public ResponseEntity<?> bar(Long id) {
        ...
    }
}

在我的测试中,我这样做了:

代码语言:javascript
运行
复制
setup:
Foo mockFoo = Stub()

given:
String id = '123'

and:
ResponseEntity<String> response = new ResponseEntity<String>('Hello World', HttpStatus.OK)

and:
mockFoo.bar(id) >> response

...

因为id被声明为String而不是Long,所以抛出了异常。但是,当我将其更改为Mock()而不是Stub()并使用基数规则时,显然没有使用更有用的错误消息来调用模拟的方法:

代码语言:javascript
运行
复制
then:
mockFoo.bar(id) >> response
0 * _  // don't allow any other interaction
代码语言:javascript
运行
复制
Handler dispatch failed; nested exception is Too many invocations for:

0 * _  // don't allow any other interaction   (1 invocation)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71653646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档