2010-10-12 5 views
1

J'aimerais substituer le constructeur d'une classe à tester. Je peux le faire comme ceci:Puis-je remplacer un constructeur en utilisant la métaprogrammation limitée à une portée dans groovy?

SomeClass.metaClass.constructor = { Map params -> 
    def instance = BeanUtils.instantiateClass(SomeClass) 
    instance.apply(params) 
    instance 
} 

Cela fonctionne, mais j'ai besoin que le nouveau constructeur ne s'applique qu'à certaines instances. En particulier, je voudrais limiter la portée de ce changement à une fermeture. J'ai essayé de faire une catégorie:

class SomeClassCategory { 
    static def constructor(instance, params) { } 
} 

use(SomeClassCategory) { 
    def x = new SomeClass(params) 
} 

Mais cela crée une méthode appelée constructor au lieu d'un constructeur réel. Est-il possible de spécifier un constructeur dans une catégorie? Ou puis-je appliquer des modifications à la métaClasse de SomeClass uniquement dans un bloc comme la construction use(Category)?

Répondre

1

Je suggère d'utiliser GMock - http://gmock.org/ - pour résoudre ce problème, d'autant plus que vous testez. Il fournit un moyen de se moquer sélectivement des méthodes, puis de vérifier les résultats, ce que je crois être ce dont vous avez besoin. Je l'utilise moi-même, et ça marche plutôt bien.

Dans leur documentation, il y a un exemple de se moquant un constructeur:

def mockFile = mock(File, constructor("https://stackoverflow.com/a/path/file.txt")) 
mockFile.getName().returns("file.txt") 

play { 
    def file = new File("https://stackoverflow.com/a/path/file.txt") 
    assertEquals "file.txt", file.getName() 
} 

Ceci, combiné peut-être avec un mock partiel, devrait résoudre votre problème.

Questions connexes