2009-06-10 9 views
0

J'ai une classe Groovy similaire àGroovy: stub tapé référence

class MyClass { 

    Foo foo 
} 

Dans certaines circonstances, je ne veux pas initialiser foo et que vous voulez écraser tous les appels à elle. Toutes les méthodes qui renvoient une valeur ne devraient rien faire. Je pouvais le faire comme ceci:

Foo.metaClass.method1 = {param -> } 
Foo.metaClass.method2 = { -> } 
Foo.metaClass.method3 = {param1, param2 -> } 

Bien que cela fonctionne, il a quelques problèmes

  1. Ennuyeux et de longue haleine, surtout si Foo a beaucoup de méthodes
  2. Cela bouchonner appels à une instance de foo (pas seulement foo)

Bien que Groovy fournit une classe StubFor, si je fais ceci:

this.foo = new groovy.mock.interceptor.StubFor(Foo) 

Je reçois une ClassCastException à l'exécution. Bien que cela fonctionnerait si je pouvais redéfinir foo comme:

def foo 

Mais pour des raisons que je pas ici, je ne peux pas le faire.

Merci, Don

Répondre

0

Vous devez passer l'instance Foo à votre objet MyClass. Dans le test, passez une implémentation de stub. Dans le vrai programme passer dans une implémentation réelle.

Vous n'avez besoin d'aucune structure spéciale pour écrire le talon. Si vous ne faites que coller des requêtes à Foo et que vous n'êtes pas intéressé par en y attendant des commandes, il est plus facile d'écrire manuellement une implémentation de stub. Une bibliothèque d'objets fantaisie est trop compliquée et va perturber les lecteurs ultérieurs du code qui s'attendront à ce que le test inclue des attentes.

0

Je suppose que c'est pour des fins de test seulement.

La ligne

Foo foo 

crée un getter/paire setter, de sorte que vous pouvez injecter une maquette dans votre cas de test faire.

new MyClass() foo = new MockFoo()

Si vous ne voulez pas créer le simulacre pour vous-même, essayez une bibliothèque moqueuse, je recommande d'utiliser mockito. Avec cette petite bibliothèque que vous pouvez faire quelque chose comme ceci:

import static org.mockito.Mockito.*; 
new MyClass().foo = mock(Foo.class); 
0

J'ai trouvé la solution:

this.foo = {Object[] args -> println "I don't do anything"} as Foo 
0

Vous pouvez faire un bout avec une carte aussi bien, permettant de stub plusieurs méthodes, comme si:

def stubbedList = [empty : { false }, get: {index -> "always return this"}] as ArrayList 

Si vous cognez une classe (comme dans l'exemple ci-dessus ArrayList), les méthodes que vous ne sont pas prioritaires sont conservés car ils sont mis en œuvre dans la classe. Vous pouvez également éliminer les interfaces de toute évidence.

Si vous avez besoin de fonctionnalités moqueuses (par exemple, vérifier le comportement d'un test, par exemple en comptant le nombre d'appels d'une méthode donnée), je vous recommande fortement de consulter le Spock test framework. Il a vraiment un grand soutien pour plus stubbing et moqueur.