2009-07-14 2 views
1

Wir schließlich unsere Unit-Test-Code-Basis von JUnit 3 bis JUnit 4. Migration Wir machen auch die starke Nutzung von JMock 2.Mangelnde Unterstützung Basisklasse in junit4/Jmock2

Mit JUnit 3 stellt JMock eine nützliche Basisklasse für Ihre Tests (MockObjectTestCase), die ebenso wie die Unterklasse von Junits TestCase selbst verschiedene Housekeeping-Aufgaben bezüglich des Mock-Frameworks übernimmt. Es macht das Leben für die Testklasse sehr einfach.

Jetzt mit JUnit4 bietet JMock keine solche Unterstützung. Ihre Testklasse muss manuell ein Mockery-Objekt erstellen, es muss daran denken, die korrekte Testläuferannotation zu verwenden, und muss alle Scheinoperationen an das Spottdelikt delegieren. Kurz gesagt, es ist viel mehr Verantwortung für die Testklasse als für JUnit 3-Tests.

Jetzt weiß ich, dass ein Teil von JUnit4 Charme ist es gibt keine Notwendigkeit, etwas Unterklasse, aber diese JMock Situation scheint wie ein Schritt zurück und macht die Portierung von 3 bis 4 mehr Arbeit als nötig sein sollte.

Fehle ich etwas? Gibt es tatsächlich eine nette Möglichkeit, meine JUnit4/Jmock2-Testklassen zu schreiben, ohne manuell alle Klempner zu jeder Klasse hinzuzufügen? Ich könnte natürlich meine eigene Support-Basis-Klasse schreiben, aber es scheint so eine offensichtliche Unterlassung von der JMock2-API zu sein, ich muss mich fragen, ob ich den Punkt verpasst habe.


Edit: Hier ist der Quellcode von dem, was die optionalen Unterstützung Klasse aussehen würde:

@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); 
    } 
} 

Diese enthält alle Methoden, die die JUnit3 MockObjectTestCase Klasse definiert, die den Spott Echo gerade. Die Annotation @RunWith gibt es auch, um zu vermeiden, dass Sie vergessen, sie zu Ihrer Testklasse hinzuzufügen.

Antwort

1

Es gibt auch Probleme mit Basisklassen. In früheren Versionen litt ich unter dem Versuch, Basisklassen aus verschiedenen Test-Frameworks zu kombinieren. Deshalb sind wir über Vererbung zur Komposition gegangen. Es wird interessant sein zu sehen, was wir mit der neuen @Rule-Struktur machen können.

+0

Ich stimme zu, dass die Zusammensetzung ist unendlich viel flexibler, aber Vererbung bringt Bequemlichkeit. Es ist schön zu pflücken. – skaffman

+1

Zur Erinnerung, ich habe einen @Rule-Kontext im JMock-Repository implementiert –

1

Nein. Es gibt keine solche Unterstützung.

Die Test-Basisklasse in JMock 1 verursachte viele Probleme, da Sie nur eine einzige Klasse erweitern können und JMock nicht mit anderen Test-Frameworks verwendet werden konnte, die auch Basisklassen definierten. Deshalb sind wir in JMock2 eher mit Delegation als mit Vererbung gegangen.

Das heißt, Sie können möglicherweise die MockObjectTestCase-Klasse von JMot2 JUnit3 Support-Bibliothek verwenden, solange Sie Ihre Klasse mit @RunWith (JMock.class) annotieren. Aber ich habe es nicht versucht.

Es wurde ein JUnit4-Runner für "automatisches Mocking" angefordert, der durch automatische Spiegelung die Kontext- und Mock-Objekte für Sie erstellt. Manche Leute mögen das, andere mögen es gar nicht. Wenn Sie diese Funktion wünschen, geben Sie ein.

+0

Oh hullo Nat, habe nicht erwartet, dich hier zu finden :) Ich habe meine Frage geändert, um die Quelle der vorgeschlagenen Basisklasse einzuschließen. Beachten Sie, dass es völlig optional ist, aber das Leben ein bisschen leichter macht. – skaffman

2

Ich habe diese Migration auch gemacht, und es ist ein Schmerz. Ich kann verstehen, warum sie den Mechanismus der Basisklasse klassiert haben - ich habe versucht, JMock-Basisklassen mit Spring JUnit-fähigen Basisklassen zu jonglieren, und das Offensichtliche funktioniert nicht.

Sobald ich mit dieser Migration begonnen habe, habe ich einen Bereich für die Optimierung gefunden, der entsprechende Expectation-Basisklassen erstellt, die gängige Operationen auf Ihren Mock-Objekten kapseln, anstatt ein neues Expectation-Objekt (und Instanz) für jeden Test zu erstellen. Das wird dir ein wenig Kummer ersparen.

+0

Denken Sie, Sie haben die falsche Nachricht kommentiert? –