【问题标题】:CGLIB throws IllegalArgumentException when trying to use a Spock SpyCGLIB 在尝试使用 Spock Spy 时抛出 IllegalArgumentException
【发布时间】:2019-01-24 18:42:00
【问题描述】:

我正在尝试监视我的服务类,但我遇到了异常,请您帮忙看看我做错了什么:

我尝试使用以下代码创建 Spy 对象,但没有按预期工作

def myService = Spy(MyService)

MyInterface.groovy

interface MyInterface<T> {

    public String welcome(T t);

}

MyService.groovy

@Service
class MyService implements MyInterface<WelcomeMessage> { 

@Override
    String welcome(WelcomeMessage welcomeMessage) {

    try { 
        // Business logic

    } catch (ex) { 

        // Catch Exception
    }

    }

}

import spock.lang.Specification
class myServiceTest extends Specification {
    def "testWelcome"() {
        setup: "create mock object"
        def myService = Spy(MyService)

        and: " and object with mock data"
        when: "invoke welcomeMessage"
        then: "Expecting no exception is thrown"
    }
}

例外:

java.lang.IllegalArgumentException
    at net.sf.cglib.proxy.BridgeMethodResolver.resolveAll(BridgeMethodResolver.java:61)
    at net.sf.cglib.proxy.Enhancer.emitMethods(Enhancer.java:911)
    at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:498)
    at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
    at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
    at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
    at net.sf.cglib.proxy.Enhancer.createClass(Enhancer.java:317)
    at org.spockframework.mock.runtime.ProxyBasedMockFactory$CglibMockFactory.createMock(ProxyBasedMockFactory.java:154)
    at org.spockframework.mock.runtime.ProxyBasedMockFactory.create(ProxyBasedMockFactory.java:68)
    at org.spockframework.mock.runtime.JavaMockFactory.createInternal(JavaMockFactory.java:59)
    at org.spockframework.mock.runtime.JavaMockFactory.create(JavaMockFactory.java:40)
    at org.spockframework.mock.runtime.CompositeMockFactory.create(CompositeMockFactory.java:44)
    at org.spockframework.lang.SpecInternals.createMock(SpecInternals.java:51)
    at org.spockframework.lang.SpecInternals.createMockImpl(SpecInternals.java:296)
    at org.spockframework.lang.SpecInternals.createMockImpl(SpecInternals.java:286)
    at org.spockframework.lang.SpecInternals.SpyImpl(SpecInternals.java:169)

感谢您的支持

【问题讨论】:

  • 我希望我可以更改主题以更清楚地说明您的问题。 :-)

标签: java groovy spock


【解决方案1】:

能否提供您的springspockcglib 版本?

对于这些问题,我无法重现所描述的问题:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.1.4.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.4.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.spockframework</groupId>
        <artifactId>spock-core</artifactId>
        <version>1.2-groovy-2.5</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>3.2.10</version>
        <scope>test</scope>
    </dependency>

我的代码几乎相同(而不是WelcomeMessage我使用String):

MyInterface.groovy

interface MyInterface<T> {
    String welcome(T t);
}

MyService.groovy

import org.springframework.stereotype.Service

@Service
class MyService implements MyInterface<String> {
    @Override
    String welcome(String welcomeMessage) {
        return welcomeMessage
    }
}

MyServiceTest.groovy

import spock.lang.Specification

class MyServiceTest extends Specification {
    def "Welcome"() {
        setup: "create mock object"
        def myService = Spy(MyService)

        when: "invoke welcomeMessage"
        def actual = myService.welcome("any")

        then:
        actual == "any"
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多