2016-08-12 1 views
3

ich für eine statische Hilfsmethode Unit-Test schreibe:Android Schreiben Unit-Test für Utility-Methoden

public static String getString(Object object, boolean prettyPrint) { 
    if (object == null) { 
     throw new NullPointerException("Cannot pass null to Utility.getString() method"); 
    } 
    Gson gson; 
    if (prettyPrint) { 
     gson = new GsonBuilder().setPrettyPrinting().create(); 
    } else { 
     gson = new Gson(); 
    } 
    return gson.toJson(object); 
} 

Hier ist das Gerät zu testen:

@Test 
public void getString() throws Exception { 
    JokeItem item = new JokeItem("title", "joke"); 
    String required = new Gson().toJson(item); 
    String actual = Utility.getString(item, false); 
    Assert.assertEquals(required, actual); 
    String required1 = "{\"joke\":\"joke\",\"title\":\"title\"}"; 
    String actual1 = Utility.getString(item, false); 
    Assert.assertEquals(required1, actual1); 
} 

JokeItem ist eine einfache pojo Klasse. Das Problem, dem ich gegenüberstehe, ist, dass ich nicht sicher bin, ob mein Testfall der richtige Weg ist, diese Methode zu testen, weil ich grundsätzlich die gleiche Methode gson.toJson(object) in beiden Methoden verwende. Es wäre sehr hilfreich, wenn ich ein paar Einblicke in Tests bekommen könnte diese Art von Funktionen und Tücken und Unzulänglichkeiten in meinem Ansatz.

+0

Wenn Sie Googles "Gson" verwenden, warum testen Sie es in der Unit? Ich teste nur Code, den ich aktiv ändern/umgestalten kann, wenn ich Bibliotheken von Drittanbietern beim jeweiligen Entwickler verwende, um sie selbst zu testen. Die einzige Abweichung ist, wenn ich Fehler in der Bibliothek selbst entdecke und beweisen möchte. – Smutje

+0

Der richtige Weg ist 'new Gson(). ToJson (item); 'weil, wenn du mehr Eigenschaften in deinem 'JokeItem' hast, würdest du vermutlich dein eigenes' 'required1'' ändern müssen – Smit

Antwort

3

Testen solcher Methoden ist eigentlich ziemlich einfach - Sie erstellen eine Reihe von Tests, die die Methode mit bestimmten Eingaben aufrufen; und dann checkst du, was zurückkommt. Wie:

@Test(expected=NullPointerException.class) 
public testCtorWithNullStringAndTrue() { 
    Whatever.getString(null, true); 
} 
// same for false 

// and then 
public testSomeInput() { 
    assertThat(Whatever.getString("whatever", true), is("expected-json-string")); 
} // same for false ... 

Wahrscheinlich brauchen Sie nicht viel mehr als das - wie Marek darauf hingewiesen hat; Sie sollten keine Gson-Implementierungen starten.

Aber: Sie möchten auf jeden Fall alle möglichen Pfade innerhalb Ihrer Methode testen; in Ihrem Fall möchten Sie einfach sicherstellen, dass Sie eine erwartete Ausgabe für einen bestimmten, festen Eingang (einschließlich aller verschiedenen Arten von "ungültigen" Eingaben!) zurückbekommen.

Schließlich auf Code-Qualität: es ist verlockend, so kleine Helfer wie statische Methoden zu schreiben; und um einen Boolean als Argument zu verwenden, aber ... das ist kein gutes OO-Design. Stellen Sie sich Folgendes vor:

interface JsonBuilder { 
    String getString(Object input); 
} 

class SimpleBuilder implements JsonBuilder 
// does what your "non-pretty print code" does 

class PrettyBuilder implements JsonBuilder 
// does the other thing 

Und statt sich Sorgen über die Verwendung von True/False; und fest Kopplung der Benutzer dieser statischen Methode an die Implementierung (schwer später zu brechen); Sie können Objekte der JsonBuilder-Schnittstelle einfach weitergeben. Und Ihr Code ruft nur diese eine Methode auf, ohne weitere Sorgen zu machen.

Vielleicht Overkill hier, aber immer noch ein Ansatz wert, darüber nachzudenken.

3

Unit-Test Gson macht keinen Sinn - es ist bereits von seinen Autoren getestet.
Da Ihre Methode ziemlich einfach ist, würde ich sagen, dass nur die erste Anweisung if getestet werden sollte und überprüft werden, wenn NullPointerException bei der Übergabe von Null-Objekt ausgelöst wird.
Wenn Sie einen stärkeren Test erstellen möchten, würde ich vorschlagen, Interaktionen mit Gson und GsonBuilder zu überprüfen, um zu überprüfen, ob die richtigen Methoden aufgerufen wurden. Aber das würde das Ausspionieren beider Objekte erfordern.