spring cloud微服务架构中引入spock单元测试框架,且采用given-when-then-where子句,包含Mock对象时,执行单元测试案例失败,提示如下错误:
org.spockframework.mock.CannotCreateMockException: Cannot create mock for class com.xxx.xxx.xxx.xxx. Mocking of non-interface types requires the CGLIB library. Please put cglib-nodep-2.2 or higher on the class path.
at org.spockframework.mock.runtime.ProxyBasedMockFactory.create(ProxyBasedMockFactory.java:52)
at org.spockframework.mock.runtime.JavaMockFactory.create(JavaMockFactory.java:51)
at org.spockframework.mock.runtime.CompositeMockFactory.create(CompositeMockFactory.java:44)
at org.spockframework.lang.SpecInternals.createMock(SpecInternals.java:45)
at org.spockframework.lang.SpecInternals.createMockImpl(SpecInternals.java:281)
at org.spockframework.lang.SpecInternals.MockImpl(SpecInternals.java:99)
at com.dashuf.fs.api.FileStoreAPITest.$spock_initializeFields(FileStoreAPITest.groovy:11)
单测代码如下:
@Unroll
def "case 01 getSignedString no exception"() {
given: "获取结果数据"
def signature = new String("signature")
when: "获取签名串"
fileStoreService.getSignedString(_) >> signature
then:
def ressign = fileStoreAPI.getSignedString(fileId as String)
ressign.equals(result)
where:
fileId | result
"01" | "signature"
"02" | "signature"
"03" | "signature"
"04" | "signature"
"05" | "signature"
}
根据提示,推测应该是少了cglib库,后面查阅资料得知:在默认情况下,Spock 只能 Mock 接口,增加 cglib 依赖之后,能够 Mock 类。
于是我们在build.gradle中引入依赖如下(版本请可自行调整):
compile(group: 'cglib', name: 'cglib-nodep', version: '3.1')
如果是采用maven则在pom.xml中加入如下依赖:
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>3.1</version>
</dependency>
重新构建工程,单元测试执行成功