2016-10-25 5 views
3

Ich implementiere Tests auf meiner Android App und ich möchte Komponententests an einem Modell durchführen. Das Problem ist, dass ich keine Setter habe, da das Modell mit Realm erstellt wird oder indem eine CSV-Datei analysiert wird (witch univocity csv parser). Also, wie könnte ich ein verspottetes Objekt mit gültigen Werten erstellen? Ich habe etwas in der Art:Mock Modellobjekt ohne Setter

public class Content { 

    private String title; 
    private String description; 

    ... 
} 

Wie könnte ich ein verspottetes Content-Objekt mit einem Titel und Beschreibung Daten generieren?

Vielen Dank im Voraus

+0

Sie können Java Reflection verwenden –

+0

Können Sie ein Beispiel zur Verwendung der Reflektion in diesem Fall geben? – FVod

Antwort

1

Benutzen Sie den Code unten in der Testklasse:

Field field = Content.class.getDeclaredField("str"); 
    field.setAccessible(true); 
    field.set(yourObject, "some value"); 

yourObject ist eine Instanz von Content, die Sie in Ihrer Test-Klasse verwenden.

Aber Sie sollten nicht Mock-Objekt füllen - Sie sollten nur Methode Ergebnis für Mock-Objekt definieren.

+0

Funktioniert wie ein Charme, danke – FVod

+0

Ich bin froh, dass ich Ihnen helfen konnte –

0

Ein Wort der Warnung: Reflexion hat eine Menge Nachteile; Zum Beispiel wird eine einfache Namensänderung für Ihre Felder unbemerkt bleiben; und führen nicht zu Compilerfehlern, sondern zu späteren Fehlertests.

Ich schlage eine andere Lösung vor - Bereitstellung eines Paket-privaten oder geschützten Konstruktors, mit dem Sie Ihre Felder initialisieren können. Dann tun Sie nicht, um Reflexion zu verwenden; und zur gleichen Zeit, Ihre „öffentliche“ Schnittstelle der Klasse ändert sich auch nicht, wie:

public class Content { 

    // unit testing only 
    Content(String title, ...) { ... 

Aber natürlich müssen Sie Balancing tun - entweder Sie fügen Sie diesen Konstruktor, nicht erforderlich für Produktion; oder du gehst mit nicht so robustem reflexionscode!

Verwandte Themen