2010-11-24 11 views
2

Wie Einheit das folgende Stück Code testen:Wie Komponententest unmittelbaren Austritt des Verfahrens

 
@Override 
public void update() { 
    if (isStopped() || isPaused()) { 
    return; 
    } 
    // ... 
} 

Diese Methode aus einem Audiostrom ist. Es muss regelmäßig aufgerufen werden, damit der Stream neue Daten liest. Wenn die Wiedergabe angehalten oder pausiert wird, sollte der Stream nicht vorspulen, daher komme ich sofort zurück. Ich kann jedoch keinen Weg finden, einen Test für diesen Code zu schreiben.

+0

Wir brauchen mehr Code zu sehen, wie diese Methode keinen sichtbaren Zustand ändert - so Welche Instanzvariablen gibt es und was tun isStopped und isPaused? – Mark

+1

Bestätigen Sie, dass was auch immer '// ...' tut, ist nicht passiert? –

+0

Die Testabdeckung der gesamten Einheit ist schwer zu erreichen und wahrscheinlich nicht die Mühe wert. Es sei denn, es gibt einige funky Interaktionen, das sieht aus wie ein Fall, den Sie in den "zu harten" Korb setzen könnten. –

Antwort

1

Vielleicht eine boolean zurückgeben, was passiert ist?

1

In diesem Fall sollten Sie testen, dass der Methodenaufruf keine Nebenwirkungen hat. Wenn der ... beispielsweise einen Methodenaufruf für einen Mitarbeiter hat, sollten Sie diesen Mitarbeiter verspotten und dann überprüfen, dass keine Methoden für den Mitarbeiter aufgerufen wurden.

Sie könnten auch in der Lage sein, zu testen, ob Eigenschaften für das Objekt, auf dem Update aufgerufen wird, nicht geändert werden, je nachdem, was eigentlich in der Klasse ist ....

0

Hier ist ein komplizierter Ansatz:

Eine Idee wäre, das Muster Observer zu implementieren, eine Listener-Schnittstelle zu definieren, die Ereignisse von Ihrer getesteten Klasse abonnieren kann. das Ereignis würde in diesem Fall nach dem if-Block gesendet werden:

public interface EventListener{ 
    // EventDetails would be an object that encapsulates 
    // event type and extra data 
    void process(EventDetails type); 
} 


private void dispatchEvent(EventType type){ 
    for(EventListener listener : this.listeners){ 
     listener.process(new EventDetails(type 
      /* you'll want to add more data than that here */)); 
    } 
} 


@Override 
public void update() { 
    if (isStopped() || isPaused()) { 
    return; 
    } 
    dispatchEvent(EventType.UPDATE); 
    // ... 
} 

Und in der Testklasse:

yourClass.addEventListener(new EventListener(){ 
    public void process(EventDetails details){ 
     if(EventType.UPDATE.equals(details.getEventType())){ 
      fail("Received update event"); 
     } 
    } 
}); 
// set to stopped or paused 
yourClass.update(); 
// if we got here, test has succeeded 

Natürlich ist dieser Ansatz einen großen Eingriff in die Art und Weise, die Dinge jetzt arbeiten, und es macht nur Sinn, wenn Ihre Anwendung tatsächlich ein Ereignisbenachrichtigungssystem verwenden könnte (die Testfunktion des Geräts ist nur ein netter Nebeneffekt).


Oder etwas ganz anderes:

im Gerät zu testen, verwenden Sie eine Unterklasse, die überschreibt welche Methode nach dem if-Block aufgerufen wird.

Also lassen Sie uns sagen, dass die Original-Code ist dies:

@Override 
public void update() { 
    if (isStopped() || isPaused()) { 
    return; 
    } 
    doUpdate(); 
} 

dann die Unterklasse würde überschreiben die doUpdate() Methode:

protected void doUpdate(){ 
    fail("I shouldn't be here"); 
} 
Verwandte Themen