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.
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
Pour l'anecdote, j'ai implémenté un contexte @Rule dans le dépôt JMock –