Lorsque nous utilisons someClass.metaClass.constructor
pour une classe spécifique (comme RESTClient
) disponible à l'intérieur de la méthode d'une classe qui est annotée avec @CompileStatic
Le remplacement du constructeur ne fonctionne pas du tout.
Quand nous avons retiré le @CompileStatic
cela fonctionne correctement. Est-ce que quelque chose m'échappe ?
Code échantillon :
@CompileStatic
class FooClass {
String getDataFromProvider() {
String url = "https://www.example.com"
RESTClient restClient = new RESTClient(url)
HttpResponseDecorator response = restClient.post([:]) as HttpResponseDecorator
return response
}
}
Et le cas d'essai :
import groovyx.net.http.HttpResponseDecorator
import groovyx.net.http.RESTClient
import spock.lang.Specification
class FooContentSpec extends Specification {
void "test getDataFromProvider method"() {
given: "Rest url"
String restURL = "https://www.example.com"
and: "Mock RESTClient"
RESTClient mockedRestClient = Mock(RESTClient)
// THIS IS NOT WORKING
RESTClient.metaClass.constructor = { Object url ->
assert restURL == url
return mockedRestClient
}
mockedRestClient.metaClass.post = { Map<String, ?> args ->
return ""
}
when: "We hit the method"
HttpResponseDecorator response = Content.getDataFromProvider()
then: "We should get status 200"
response.statusCode == 200
}
}
Selon le Groovy Lang doc :
MockFor
yStubFor
ne peut pas être utilisé pour tester des classes compilées statiquement, par exemple pour les classes Java ou Groovy qui font appel à@CompileStatic
. Pour bloquer et/ou simuler ces classes, vous pouvez utiliser Spock ou l'une des bibliothèques de simulation Java.
Comportement attendu
Dans ce scénario, la surcharge du constructeur de l'option RESTClient
devrait fonctionner dans nos scénarios de test car nous ne voulons pas utiliser l'API d'un tiers dans chaque scénario de test.
Comportement réel
Malheureusement, RESTClient
ne fait pas l'objet de moqueries à cause de @CompileStatic
il frappe l'API à chaque fois.
Informations sur l'environnement
------------------------------------------------------------
Gradle 3.5
------------------------------------------------------------
Groovy: 2.4.10,
Ant: Apache Ant(TM) version 1.9.6 compiled on June 29 2015,
JVM: 1.8.0_221 (Oracle Corporation 25.221-b11),
OS: Mac OS X 10.15.2 x86_64