2016-12-02 4 views
1

Ich habe eine Java-Klasse A. A's Konstruktor ruft wenige Methoden m1, m2.Was ist der beste Weg, Methoden innerhalb von Methoden zu testen? (JUnit)

class A{ 

    public A(){ 
     m1(); 
     m2(); 
    ...... } 

    public void m1(){...}; 
    public void m2(){...}; 
} 

Wie schreibt man Tests für diese Methoden? Ich schreibe sie im Allgemeinen als

class TestClass{ 

static A a = null; 

public TestClass(){ 
    a = new A(); 
} 

@Test 
public testm1(){ 
    A.m1(); 
    //Some logic 
} 

Diese Funktionen werden jedoch im Konstruktor selbst aufgerufen. Es sieht so aus, als würde ich die Methode zweimal zur Überprüfung ausführen, und der Konstruktor selbst schlägt fehl, wenn die Methode falsch geschrieben wird. Was ist der richtige Weg, um es zu testen?

+2

Wichtig; Methoden nicht testen, Verhalten testen – JonK

+0

Auch hilfreich: Vermeiden Sie nur innere (insbesondere nicht statische) Klassen. In Eclipse würden Sie das tun, indem Sie den Cursor auf den inneren Klassennamen setzen, "Alt + Shift + T" drücken und dann "V" drücken. Das würde deine innere Klasse nach draußen bewegen, wo du testen kannst, wie du es willst. Vor allem können Sie die äußere A-Klasse spotten –

Antwort

5

Zunächst einmal sieht Ihre Schnittstelle seltsam aus.

Sie sehen, es hat nicht viel Sinn, eine öffentliche Methode zu haben, die eine andere öffentliche Methode aufruft. Das echte Problem ist hier genau das, was Sie beschrieben haben: die Tatsache, dass Ihr Konstruktor diese Methoden m1 und m2 aufruft.

Entweder ruft der Konstruktor diese Methoden auf, dann sollten sie idealerweise privat sein; oder sie sind öffentlich, aber es sollte nicht Aufgabe des Konstrukteurs sein, sie anzurufen.

In diesem Sinne: Die Antwort ist, zurückzutreten und genau in diesen Aspekt Ihres Entwurfs zu schauen; und wenn möglich, ändere das!

In jedem Fall: wenn Sie Ihr aktuelles Design behalten; Es gibt keinen anderen Weg, als dieses Zeug "mehrfach" zu testen. Sie sehen: Ihre Tests müssen sicherstellen, dass Ihr Konstruktor funktioniert (egal, ob dieser ctor einige m1(), m2() oder m3() aufruft oder keine davon); aber dann müssen Sie sicherstellen, dass auch das Aufrufen aller öffentlichen Methoden einer vorhandenen Instanz Ihrer Klasse funktioniert!

Am Ende: Sie rufen Ihre Methoden nicht, weil "sie existieren". Jede Methode sollte einen klaren Zweck haben (aka Vertrag); und Sie schreiben Testfälle, um sicherzustellen, dass diese Verträge aufgehalten werden.

+0

Wenn ich m1, m2 als öffentlich mache, gibt es keine Möglichkeit, diese einzelnen Funktionen zu testen, abgesehen vom Testen des kompletten Konstruktors auf einmal. Ich denke, das ist ein häufiger Fall, der viele Male kommt, wo Konstruktoren viele Funktionen wie initializeVariables() usw. aufrufen können. Wie testen wir diese? – Sashank

+0

Nochmal: Das Problem ist: Ihr Konstruktor sollte wahrscheinlich ** nicht ** öffentliche Methoden aufrufen. Warum möchtest du etwas wie "initializeVariables" eine ** öffentliche ** Methode machen, die später wieder aufgerufen werden könnte ?! – GhostCat

Verwandte Themen