2017-01-10 1 views
1

Ich habe GPS-Leser-Klasse, die Koordinaten von einem GPS-Empfänger liefert. Dies funktioniert natürlich bei Maschinen mit echten Empfängern. Jetzt habe ich eine Mockup-Klasse erstellt, die mir zufällig Koordinaten gibt, damit ich meine Anwendung starten und sehen kann, ob alles funktioniert, ohne sie auf einem anderen Rechner einsetzen zu müssen.Wie man Produktion und Modellklasse richtig trennt

Nun ist dies die Struktur:

class AbstractGPSReader { 
} 

class RealGPSReader extends AbstractGPSReader { 
} 

class FakeGPSReader extends AbstractGPSReader { 
} 

class SomeOtherClass { 
    private AbstractGPSReader gpsReader = new RealGPSReader(); 
} 

Um in der Lage sein, um die Anwendung zu testen ich

new RealGPSReader() 

mit

new FakeGPSReader() 

Gibt es eine elegantere Möglichkeit ersetzen? Kann ich verhindern, dass jemand diese Klasse in der Produktion verwendet?

+0

Sie können mit Mockito [http://site.mockito.org/](http://site.mockito.org/) spotten. Es ist sehr einfach und kompatibel mit Junit Tests – Valijon

+0

Ich möchte es selbst testen. Ich denke, das ist für Unit-Tests, oder? – user489872

+0

Wenn Sie Feder verwenden, können Sie Ihre Klassen basierend auf Profilen instanziieren und autowire. – questionare

Antwort

2

Sie sollten dependency injection verwenden. Es ist ziemlich einfach: Klassen sollten Instanzen ihrer Abhängigkeiten gegeben werden, anstatt die Abhängigkeiten selbst zu erstellen.

Zum Beispiel:

class SomeOtherClass { 
    private final AbstractGPSReader gpsReader = new RealGPSReader(); 
} 

wird zu:

class SomeOtherClass { 
    private final AbstractGPSReader gpsReader; 
    public SomeOtherClass(AbstractGPSReader gpsReader) { 
     this.gpsReader = gpsReader; 
    } 
} 

Der Vorteil hierbei ist, dass jetzt nur SomeOtherClassAbstractGPSReader gekoppelt ist, während es vorher zu AbstractGPSReader und RealGPSReader gekoppelt wurde.

Dies ist ein großer Vorteil, wenn Komponententests schreiben, weil jetzt kann die Klasse durch eine Testsuite unmodifizierten verwendet werden:

void testSomeOtherClass() { 
    SomeOtherClass someOtherClass = new SomeOtherClass(new FakeGPSReader()); 
    someOtherClass.someMethod(); 
    // etc... 
} 

Es gibt Rahmenbedingungen, die Sie die Injektion von Abhängigkeiten automatisiert helfen kann, aber ich würde vorschlagen, auf denen zu halten, um die Einfachheit des Codes zu bewahren.


Nebenbei sollten Sie versuchen, Ihre API um Schnittstellen statt abstrakte Klassen zu bauen.

+0

Das scheint vernünftig, danke! Ich kann keine Schnittstelle benutzen, aber ich habe es versucht :) Es ist alter Code, den ich verbessern möchte. – user489872

Verwandte Themen