2016-07-01 13 views
0
public interface MessageProducer { 
    public void produce(String message); 
    public Map<String, Set<String>> getMessagesMapped(); 
} 

public MessageProducerImpl { 
    @Override 
    public void produce(String message) { 
     //code logic here calls private class methods to manipulate messages 
    } 

@Override 
public Map<String, Set<String>> getMessagesMapped() { 
    return map; 
} 
} 

Wie sollte man Testfahrt ein Szenario wie das oben und sorgen für eine gute Testabdeckung zu gewährleisten, wenn:, wie gut Test-Abdeckung mit Void Methoden

  • Einstiegspunkt produce() nichtig erfüllt, ist definiert Auftrags durch Schnittstelle und hat keinen Rückgabetyp.
  • andere Methoden sind private in der MessageProducerImpl Klasse
  • Nicht-Oberfläche zu ändern
  • erlaubt

Antwort

1

Sie die Schnittstelle nicht testen, können Sie die Implementierung testen. Die Schnittstelle ist möglicherweise zu allgemein zum Testen.

Obwohl es eine ungültige Methode ist, sollte es etwas tun. Schreibe in Datei, aktualisiere den Cache, alles. Da es sich um eine ungültige Methode handelt, sollte es einen Nebeneffekt haben. (wenn es nicht ist, kann es entfernt werden, oder?)

Also, testen Sie die Ergebnisse, da offenbar die Nebenwirkungen Teil des Vertrages sind (und daher getestet werden sollten).

In Ihrem Beispielcode haben Sie ein statusbehaftetes Objekt (wird normalerweise nicht empfohlen, es sei denn, es handelt sich um ein einfaches Wertobjekt/DTO). Daher können Sie es nur als Ganzes testen, da es vom Status abhängig ist. (Zum Beispiel hielte es für eine zusätzliche Methode, den Einfluss auf die produce() Methode Logik)

So umfasst die Prüfung beiden Methoden zumindest
Für Ihren Beispielcode, ein Probe-Test:

@Test public void myTest() { 
    MessageProducerImpl underTest = new MessageProducerImpl(); 
    String sampleInputString = ....; // a sample string, from which the expected result is that it's split in 4 keys 
    underTest.produce(sampleInputString); 
    Map<String, Set<String>> result = underTest.getMessagesMapped(); 
    assertEquals(4, result.size()); 
} 

Ihres Code Coverage-Tool sollte es dann grün markieren.

+0

In der Testklasse, ich rufe 'produce()' Methode der Implementierung, die eine Karte erstellt und dann die Karte Schlüssel/Werte getestet werden? aber das würde rot noch in der Testabdeckung als 0% für Linien und Methoden kennzeichnen. – user2781389