有人可以告诉我这是一个错误还是预期的行为。
我知道在Spock中我可以测试私有方法:
def "test with private"() {
given:
FileContentValidator fileContentValidator = new FileContentValidator(1)
when:
fileContentValidator.validateCustomerSiteId("") // this is a private method
then:
true // succeeds
}
但是当我使用Spock Spy尝试同样的事情时,它失败了:
def "test with private on spy"() {
given:
FileContentValidator fileContentValidator = Spy(FileContentValidator, constructorArgs: [1])
when:
fileContentValidator.validateCustomerSiteId("") // this is a private method
then:
true // does not get here
}
我得到一个例外:
groovy.lang.MissingMethodException: No signature of method: com.shoppertrak.device.management.web.validator.ophour.FileContentValidator$$EnhancerByCGLIB$$7ff6a42.validateCustomerSiteId() is applicable for argument types: (java.lang.String) values: []
答案 0 :(得分:1)
我认为这是由于cglib
的工作方式造成的。在测试现有的具体类时,Spock不会参与字节码,因此您可以利用Groovy中的缺陷,该缺陷使您可以访问私有方法。当spy
或mock
属于同一类时,Spock / cglib操作会介入并更改结果字节码。最终产品是真正私有的方法,因此您无法访问它。
您可能可以使用一些技巧来解决它,但是最好添加带有公共CustomerSiteIdValidator
的{{1}}类之类的东西,并将其注入您的validateCustomerSiteId()
类。然后,您可以轻松地模拟它并隔离职责。
有人建议将功能添加到FileContentValidator
私有方法中,但是由于无法解决问题,工单已关闭
https://github.com/spockframework/spock/issues/403