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 mock的mock
方法, 方法参数需要匹配的, 注意不要引用了spock的any()方法, 而应该使用power mock的any方法, 二者不能混用, 否则会报错
正确引用路径org.mockito.ArgumentMatchers
:
错误引用路径org.codehaus.groovy.runtime.DefaultGroovyMethods
:
记得前提是在powermock的api里使用参数匹配,如果是spock的mock
方法,直接使用_
下划线即可。
更多注意事项参考之前的这篇文章:https://javakk.com/322.html
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/547.html
暂无评论