2009-07-14 11 views
1

Nous sommes enfin migrer notre unité d'essai base de code de JUnit 3 à 4. JUnit Nous faisons également une utilisation intensive de JMock 2.Le manque de soutien classe de base dans junit4/Jmock2

Avec JUnit 3, JMock fournit un utile classe de base pour vos tests (MockObjectTestCase), qui, tout en étant elle-même la sous-classe de TestCase de Junit, gère les différentes tâches de gestion concernant le cadre de simulation. Cela rend la vie assez facile pour la classe de test.

Maintenant avec JUnit4, JMock ne fournit pas un tel support. Votre classe de test doit créer manuellement un objet Mockery, elle doit se souvenir d'utiliser l'annotation de coureur de test correcte, et doit déléguer toutes les opérations liées à des simulacres à la moquerie. En bref, il met beaucoup plus de responsabilités sur la classe de test que ce qui était nécessaire pour les tests JUnit 3. Maintenant, j'apprécie qu'une partie du charme de JUnit4 ne soit pas nécessaire de sous-classer quelque chose, mais cette situation JMock semble être un pas en arrière, et rend le portage de 3 à 4 plutôt plus de travail que nécessaire.

Ai-je raté quelque chose? Est-ce qu'il y a vraiment un bon moyen d'écrire mes classes de test JUnit4/Jmock2 sans ajouter manuellement toute cette plomberie à chaque classe? Je pourrais écrire ma propre classe de base de support, bien sûr, mais cela semble une omission évidente de l'API JMock2, je dois me demander si j'ai manqué le point.


Edit: voici le code source de ce que la classe de soutien en option ressemblerait à ceci:

@RunWith(JMock.class) 
public class JMockSupport { 

    protected final Mockery mockery = new Mockery(); 

    protected void checking(ExpectationBuilder expectations) { 
     mockery.checking(expectations); 
    } 

    protected <T> T mock(Class<T> typeToMock) { 
     return mockery.mock(typeToMock); 
    } 

    protected <T> T mock(Class<T> typeToMock, String name) { 
     return mockery.mock(typeToMock, name); 
    } 

    protected Sequence sequence(String name) { 
     return mockery.sequence(name); 
    } 

    protected void setDefaultResultForType(Class<?> type, Object result) { 
     mockery.setDefaultResultForType(type, result); 
    } 

    protected void setImposteriser(Imposteriser imposteriser) { 
     mockery.setImposteriser(imposteriser); 
    } 

    protected void setNamingScheme(MockObjectNamingScheme namingScheme) { 
     mockery.setNamingScheme(namingScheme); 
    } 

    protected States states(String name) { 
     return mockery.states(name); 
    } 
} 

Il contient toutes les méthodes que la classe JUnit3 MockObjectTestCase définies, qui font écho à juste la moquerie. L'annotation @RunWith est là aussi, pour éviter la possibilité d'oublier de l'ajouter à votre classe de test.

Répondre

1

Il existe également des problèmes avec les classes de base. Dans les versions précédentes, j'ai souffert d'essayer de combiner des classes de base à partir de différents cadres de test. C'est pourquoi nous sommes allés à la composition sur l'héritage. Ce sera intéressant de voir ce que nous pouvons faire avec la nouvelle structure @Rule.

+0

Je suis d'accord que la composition est incommensurablement plus flexible, mais l'héritage apporte la commodité. C'est sympa de pouvoir choisir. – skaffman

+1

Pour l'anecdote, j'ai implémenté un contexte @Rule dans le dépôt JMock –

1

Non. Il n'existe aucun support de ce type. La classe de base de test dans JMock 1 a causé beaucoup de problèmes, car vous ne pouvez étendre qu'une seule classe, et donc les gens ne pouvaient pas utiliser JMock avec d'autres frameworks de test qui définissaient aussi des classes de base. C'est pourquoi nous sommes allés avec la délégation plutôt que l'héritage dans JMock2. Cela dit, vous pouvez utiliser la classe MockObjectTestCase de la bibliothèque de support JUnit3 de JMock2 tant que vous annotez votre classe avec @RunWith (JMock.class). Mais je n'ai pas essayé.

Il y a eu une demande pour un runner JUnit4 "auto-moqueur" qui va créer le contexte et les objets fictifs pour vous par réflexion automagique. Certaines personnes aiment ça, d'autres ne l'aiment pas vraiment. Si vous voulez cette fonctionnalité, vote for the issue in the JMock JIRA.

+0

Oh hullo Nat, je ne m'attendais pas à vous trouver ici :) J'ai modifié ma question pour inclure la source de la classe de base suggérée. Notez que c'est entièrement facultatif, mais cela rend la vie un peu plus facile. – skaffman

2

J'ai aussi fait cette migration, et c'est une douleur. Je peux comprendre pourquoi ils ont binned le mécanisme de classe de base - j'essayais de jongler avec les classes de base de JMock avec des classes de base Spring JUnit, et cela ne marche pas. Une fois que j'ai commencé cette migration, une zone que j'ai trouvée pour 'optimisation' créait des classes de base Expectation appropriées encapsulant des opérations communes sur vos objets fantômes, plutôt que de créer un nouvel objet Expectation (et une instance) pour chaque test. Cela vous épargnera un peu de chagrin.

+0

Vous pensez avoir mal commenté le message? –