2009-05-27 13 views
1

J'ai une classe énorme dont j'ai besoin pour construire le talon.Stubbing automatique dans le mot java. Que utiliser?

Pour vous donner une image c'est la classe Messages du GWT. C'est souvent une classe avec des dizaines de méthodes qui retournent la chaîne. Avec JMock je peux faire du stubbing, mais je vais finir par autoriser chaque méthode ... Ce n'est pas quelque chose que je voudrais voir.

Y a-t-il quelque chose qui construira automatiquement les stubs pour chaque méthode? J'ai besoin de ces méthodes pour retourner quelque chose de prédéfini, comme une chaîne vide, mais je serai heureux avec des suggestions.

Répondre

1

Dans JMock, vous pouvez autoriser les méthodes qui vous intéressent avec des résultats explicites, puis autoriser toute autre méthode de l'objet message avec une instruction permettant d'exclure une méthode. .: par exemple

allowing(m).getBlah("something"); 
    will(returnValue("foo")); 
allowing(m); // matches anything else, will return some default value if called 

Mais ...

Si vous êtes stubbing un tas de méthodes getter, un cadre d'objet simulé est le mauvais outil à utiliser. Les objets simulés sont utilisés pour tester que l'objet testé envoie les commandes correctes aux objets voisins pour effectuer des modifications dans son environnement.

Il est souvent plus facile de créer une classe de raccord si l'interface qui contient uniquement des getters. Ou vous pouvez utiliser Usurper pour générer des talons automatiquement.

+0

Merci d'avoir permis (m); c'est celui que j'ai cherché .. En ce qui concerne le choix de l'outillage, le problème avec la classe stub est que j'ai besoin de l'actualiser à chaque fois que j'ai fait quelque chose sur l'interface ... C'est pourquoi j'ai besoin de quelque chose qui crée automatiquement des stubs à la volée. Usurper est bon, je vais essayer ça. –

0

Si vous utilisez EasyMock, il vous suffit de spécifier le comportement/attentes/talons pour les méthodes que vous attendez réellement d'être appelé et utilisé. Après avoir utilisé à la fois JMock et EasyMock, je dois dire que l'API d'EasyMock est environ 10 fois plus facile à utiliser, et que l'interface est généralement statique, elle est également sécurisée (vous utilisez des chaînes pour les noms de méthodes, etc. .).

+0

Merci, mais dans ce JMock sur le terrain et EasyMock sont les mêmes ... Les deux interfaces fournissent tapées .. Et statiquement j'ai regardé caractéristique paticular qui est quelque chose qui correspond à tout sur l'interface ... peut-être –

+0

C'est un changement JMock 1 vs JMock 2 alors, j'ai seulement utilisé la version 1 ... –

+0

Oui. Nous avons finalement appris de Tammo et nous nous sommes débarrassés des noms de méthodes de cordes - bien qu'il y ait des choses que nous avons perdues dans ce compromis –

1

Pour une interface, vous pouvez utiliser la fonctionnalité de java.lang.reflect.Proxy. En supposant que vous voulez bouchonner réponses pour la classe MessageConstants, le code ressemblera à:

 InvocationHandler handler = new InvocationHandler() { 

     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 

      if (String.class.equals(method.getReturnType())) 
       return "proxy generated method return"; 

      throw new AbstractMethodError("Not implemented"); 
     } 
    }; 
    Class<?> proxyClass = Proxy.getProxyClass(MessageConstants.class.getClassLoader(), new Class[] { MessageConstants.class }); 
    MessageConstants messageConstants = (MessageConstants) proxyClass.getConstructor(new Class[] {InvocationHandler.class}).newInstance(new Object[] { handler }); 

    System.out.println(messageConstants.description()); 

    messageConstants.getBoolean("someBoolean"); 

et entraînera

proxy generated method return 
Exception in thread "main" java.lang.Error: Not implemented 
at xxx.Application$1.invoke(Application.java:48) 
at $Proxy0.getBoolean(Unknown Source) 
at xxx.Application.main(Application.java:64) 

Le InvocationHandler entraîne le stubbing, tandis que le reste est juste plomberie.

+0

Ceci est une réponse hautement éducable, désolé mais je ne peux pas marquer deux réponses .. Merci beaucoup. –

1

Content de vous voir trouver une réponse. Juste pour plus d'informations, jMock permet des spécifications assez flexibles de la façon dont vous correspondez aux méthodes, voir http://www.jmock.org/match-object-or-method.html. Par exemple, vous pouvez faire ce genre de chose:

allowing (any(Object.class)).method("get.*").withNoArguments(); 

pour correspondre à n'importe quel getter.

S

+0

merci, je vais essayer cela. –