Spock bug测试私有方法?

时间:2016-02-16 20:20:38

标签: java groovy spock

有人可以告诉我这是一个错误还是预期的行为。

我知道在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: []

1 个答案:

答案 0 :(得分:1)

我认为这是由于cglib的工作方式造成的。在测试现有的具体类时,Spock不会参与字节码,因此您可以利用Groovy中的缺陷,该缺陷使您可以访问私有方法。当spymock属于同一类时,Spock / cglib操作会介入并更改结果字节码。最终产品是真正私有的方法,因此您无法访问它。

您可能可以使用一些技巧来解决它,但是最好添加带有公共CustomerSiteIdValidator的{​​{1}}类之类的东西,并将其注入您的validateCustomerSiteId()类。然后,您可以轻松地模拟它并隔离职责。

有人建议将功能添加到FileContentValidator私有方法中,但是由于无法解决问题,工单已关闭 https://github.com/spockframework/spock/issues/403