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.
Ich stimme zu, dass die Zusammensetzung ist unendlich viel flexibler, aber Vererbung bringt Bequemlichkeit. Es ist schön zu pflücken. – skaffman
Zur Erinnerung, ich habe einen @Rule-Kontext im JMock-Repository implementiert –