2010-05-25 12 views
7

Ich versuche zu lernen, wie man Tests schreibt.Wie Sie mit dem Testen beginnen (jMock)

http://www.theserverside.com/news/1365050/Using-JMock-in-Test-Driven-Development

http://jeantessier.com/SoftwareEngineering/Mocking.html#jMock

Und die meisten Artikel: Ich lerne auch Java, wurde mir gesagt, ich sollte lernen/Nutzung/Praxis JMock, habe ich einige Artikel online, die helfen, zu gewissen Grad wie gefunden Ich fand heraus, dass es um testgetriebene Entwicklung ging, schreibe zuerst Tests und schreibe dann Code, um den Test bestanden zu haben. Das suche ich momentan nicht, ich versuche mit jMock Tests für bereits vorhandenen Code zu schreiben.

Die official documentation ist vage, gelinde gesagt und einfach zu schwer für mich. Hat jemand einen besseren Weg dies zu lernen? Gute Bücher/Links/Tutorials würden mir sehr helfen. danke

EDIT - konkretere Frage:

http://jeantessier.com/SoftwareEngineering/Mocking.html#jMock - von diesem Artikel

versucht, diese, diese einfache Klasse zu verspotten:

import java.util.Map; 
    public class Cache { 
     private Map<Integer, String> underlyingStorage; 
     public Cache(Map<Integer, String> underlyingStorage) { 
      this.underlyingStorage = underlyingStorage; 
     } 
     public String get(int key) { 
      return underlyingStorage.get(key); 
     } 
     public void add(int key, String value) { 
      underlyingStorage.put(key, value); 
     } 
     public void remove(int key) { 
      underlyingStorage.remove(key); 
     } 
     public int size() { 
      return underlyingStorage.size(); 
     } 
     public void clear() { 
      underlyingStorage.clear(); 
     } 
    } 

Hier ist, wie ich versuchte, Erstellen Sie einen Test/Mock:

public class CacheTest extends TestCase { 

    private Mockery context; 
    private Map mockMap; 
    private Cache cache; 

    @Override 
    @Before 
    public void setUp() { 
     context = new Mockery() { 
      { 
       setImposteriser(ClassImposteriser.INSTANCE); 
      } 
     }; 

     mockMap = context.mock(Map.class); 
     cache = new Cache(mockMap); 
    } 

    public void testCache() { 
     context.checking(new Expectations() {{ 
      atLeast(1).of(mockMap).size(); 
      will(returnValue(int.class)); 
     }}); 

    } 
} 

Es besteht den Test und im Grunde nichts, was ich wollte, ist eine Karte zu erstellen und überprüfen Sie ihre Größe, und Sie wissen, arbeiten einige Variationen versuchen, dies in den Griff zu bekommen. Verstehe bessere Beispiele, was ich sonst hier noch testen könnte oder andere Übungen würden mir sehr helfen. tnx

+1

Keine Antwort aber: Ich würde empfehlen zu lernen, wie man Tests schreibt, bevor man in Mocks schaut. Mocks sind ein fortgeschrittenes Thema beim Testen, Sie sollten zuerst die Grundlagen beherrschen. – Arne

+0

@Arne Kannst du mir eine konkrete Antwort geben, was als Grundlagen betrachtet werden? Ich bin ein schneller Lerner und sage nicht, dass ich schlauer bin als andere Leute, nur ich bin begierig zu lernen und habe viel Zeit in meinen Händen. Wenn also eine Sache langweilig wird, kann ich mich auf die andere einfache/fortgeschrittene Ebene konzentrieren. tnx – London

+0

Sie können Ihre Tests ohne ein spöttisches Framework schreiben. Verwenden Sie einfach JUnit, um Ihre Tests zu schreiben. Wenn Sie Ihren Code fließend testen und dann auf einen Fall stoßen, den Sie ohne einen Spott nicht bewältigen können, versuchen Sie es mit einem spöttischen Rahmen. Die Notwendigkeit für ein Spott sollte die Ausnahme sein, nicht die Regel. – Arne

Antwort

5

Hier ist ein Tutorial über die Verwendung von JUnit und EasyMock (spöttisch Bibliothek, die ich persönlich sehr viel einfacher zu bedienen als JMock finden): http://www.michaelminella.com/testing/unit-testing-with-junit-and-easymock.html

Selbst wenn Sie sich 100% ig der Verwendung von JMock widmen, sind die Konzepte zwischen den beiden gleich und dies sollte Ihnen helfen, sie besser zu verstehen.

Der Zweck der Verspottung ist, dass, wenn Sie Klasse testen A, die auf B und C, Ihr Test von A verwendet Mock Versionen von B und C in der Lage sein, hängt vielmehr deren genaue Verhalten angeben, als die realen Implementierungen von B mit und C in Ihrem Test von A.Andernfalls testen Sie nicht nur die einzelne Einheit A, sondern testen implizit auch B und C.

+0

Kannst du Konstrukteure spielen, da sie keine Methoden sind, die ich immer noch kämpfe, um alles zu verstehen? – London

+0

Einige Bibliotheken unterstützen Spottklassen und nicht nur Schnittstellen (EasyMock 3.0 behauptet dies), aber ich bin nicht sehr vertraut damit. Mocking glänzt, wenn Ihre Klassen Abhängigkeiten voneinander ausdrücken, abhängig von einer * Schnittstelle * und nicht einer * konkreten Klasse *. –

1

Ich weiß nicht, wie weit Sie den Weg zum Lernen über Mock-Objekte im Test gegangen sind, also werde ich eine kurze Beschreibung schreiben und Sie dann in die Richtung eines Artikels weisen, der hilfreich sein kann Sie. Mock-Objekte werden im Komponententest verwendet, um externe Abhängigkeiten zu ersetzen, die schwer zu erstellen sind oder schwer in den Zustand zu bringen sind, den Sie für Ihren Test verwenden möchten. Die verschiedenen Mock-Frameworks, die es gibt, geben Ihnen Mechanismen, um "falsche" Objekte zu erstellen, die an die Stelle dieser Abhängigkeiten treten. Diese Mock-Objekte behalten die Anrufe, die von Ihrem Code kommen, im Auge und ermöglichen es Ihnen später, Aussagen über diese Interaktionen zu machen. Es gibt einen bekannten Artikel über Mock-Objekte und ihre Beziehung zu "Stubs", einer weiteren gängigen Teststrategie zur Vereinfachung externer Abhängigkeiten. Es wurde von Martin Fowler geschrieben und kann hier bestellt werden:

http://martinfowler.com/articles/mocksArentStubs.html

+0

Kannst du Konstrukteure spielen, weil sie keine Methoden sind, die ich immer noch kämpfe, um alles zu verstehen? – London

+0

Nein, das Mocking wird auf Klassenebene gemacht, also wird das Mocking-Framework mit der Erstellung des "Proxy" (d. H. Mock) -Objekts für Sie umgehen. Beachten Sie, dass dieses Objekt nicht das Verhalten des Objekts, das es verspottet, implementiert. Der Zweck besteht darin, die Interaktionen mit ihm zu verfolgen und zu überprüfen, ob diese Interaktionen so verlaufen sind, wie Sie es erwartet haben. –

+0

Vielen Dank für Ihre Erklärung, wie kann ich einige dieser Methoden testen? – London

2

Sie brauchen diese Klasse nicht wirklich zu testen, da ihr einziger Mitarbeiter eine Karte ist, die Sie genauso verwenden können wie sie ist. Auch Ihre Klasse tut eigentlich nichts (außer Delegierte), weshalb Sie das Gefühl haben, dass Sie nicht viel testen.

könnte ein gerader Test werden (Ich gehe davon aus Sie JUnit 4 verwenden - Code ist eine seltsame Mischung aus JUnit 3 und 4

@Test 
public void sizeIs0WhenEmpty() 
{ 
    Map<Integer, String> map = Collections.emptyMap(); 
    Cache cache = new Cache(map) 
    assertEquals(0, cache.size()); 
} 

mit spottet es (vorausgesetzt, der Mock-Code sein würde, ist richtig - ich verwende JMock nicht)

@Test 
public void sizeIs0WhenEmpty() 
{ 
    context.checking(new Expectations() {{ 
        atLeast(1).of(mockMap).size(); 
        will(returnValue(0)); 
        }}); 
    assertEquals(0, cache.size()); 
} 

In beiden Fällen müssen Sie das System-Setup, indem Sie die Karte zur Einstellung der Eigenschaften, die Sie testen möchten und dann zu prüfen, ob der Cache die gleichen Eigenschaften hat (wie es ist ein direkter Delegierter)

Ich würde empfehlen, lesen Sie about JUnit, bevor Sie fortfahren.

4

Als Autor von JMock würde ich nicht mit der Technik beginnen, bis Sie etwas Erfahrung mit TDD haben. Beginne einfach mit den Grundlagen und lass es funktionieren. Wenn Sie Schwierigkeiten mit der Skalierung haben und ein Design entwickeln, kommen Sie zurück zur Technik.

Das Dave Astels Buch ist immer noch eine gute Einführung und die einzige, denke ich, dieser Generation, die Mocks gut erklärt. Danach könnten Sie (ähem) betrachten unsere „Object Oriented Software Growing, geleitet von Tests“

Rabatt wer du, es ist alles, um Tests gegen das Dateisystem gehen schneller erzählt.

Verwandte Themen