4年前 (2020-10-08)  Spock系列 |   抢沙发  1195 
文章评分 1 次,平均分 5.0

Spock和Mockito注解混用问题

因为Spock并不支持Mockito和power mock的@InjectMocks@Mock的组合,运行时会报错,如果你一定要使用对应的功能可以引入Mockitio为Spock专门开发的第三方工具:spock-subjects-collaborators-extension使用@Subject@Collaborator代替@InjectMocks@Mock

代码如下:

import spock.lang.Specification
import com.blogspot.toomuchcoding.spock.subjcollabs.Collaborator
import com.blogspot.toomuchcoding.spock.subjcollabs.Subject
 
class ConstructorInjectionSpec extends Specification {
 
    public static final String TEST_METHOD_1 = "Test method 1"
 
    SomeOtherClass someOtherClassNotToBeInjected = Mock()
 
    @Collaborator // 类似于Mockito的@Mock
    SomeOtherClass someOtherClass = Mock()
 
    @Subject // 类似于Mockito的@InjectMocks
    SomeClass systemUnderTest
 
    def "should inject collaborator into subject"() {
        given:
        someOtherClass.someMethod() >> TEST_METHOD_1
 
        when:
        String firstResult = systemUnderTest.someOtherClass.someMethod()
 
        then:
        firstResult == TEST_METHOD_1
        systemUnderTest.someOtherClass == someOtherClass
    }
 
    class SomeClass {
        SomeOtherClass someOtherClass
 
        SomeClass(SomeOtherClass someOtherClass) {
            this.someOtherClass = someOtherClass
        }
    }
 
    class SomeOtherClass {
        String someMethod() {
            "Some other class"
        }
    }
}

具体参考:

http://github.com/marcingrzejszczak/spock-subjects-collaborators-extension

我个人的建议是用PowerMockito.mock()的方式代替注解,虽没有注解的语法简洁,但不用再引入额外的依赖

power mock参数匹配方法 any()

如果在Spock里使用了power mockmock方法, 方法参数需要匹配的, 注意不要引用了spock的any()方法, 而应该使用power mock的any方法, 二者不能混用, 否则会报错

正确引用路径org.mockito.ArgumentMatchers

Spock注意事项补充一

错误引用路径org.codehaus.groovy.runtime.DefaultGroovyMethods

Spock注意事项补充一

记得前提是在powermock的api里使用参数匹配,如果是spock的mock方法,直接使用_下划线即可。

更多注意事项参考之前的这篇文章:https://javakk.com/322.html

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/547.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册