2016-04-21 10 views
1

Ich habe eine Klasse, die eine Zeichenfolge verarbeitet und viele Aktionen nacheinander ausführt.Refactoring, um private Methoden für Unit-Tests verfügbar zu machen

Diese Aktionen müssen in einer bestimmten Reihenfolge ausgeführt werden.

Beispiel:

public String process(String stringToProcess) throws Exception { 

    processedString = process1(processedString); 
    processedString = process2(processedString); 
    processedString = process3(processedString); 
    processedString = process4(processedString); 
    ... 
    processedString = process10(processedString); 
    ... 

    return processedString; 
} 

Ich bin sicher, dass es einen besseren Weg, dies zu machen, sauberer, Refactoring ist aber vor allem möchte ich Unit-Test process1 der Lage sein, process2 usw.

Beachten Sie, dass process1, 2 etc ... ob 2-Linien-Methoden oder große sein können.

Ich würde die Prozessmethoden irgendwie öffentlich sein müssen, um sie zu testen. Gibt es ein Entwurfsmuster, das dies erreichen würde?

Ich dachte über Enums, um dies zu erreichen, aber ich dachte, dass es irgendwie verwirrender macht. Diese Implementierung ist nicht die beste, aber auf einen Blick wissen Sie, was passiert.

Bearbeiten: Dieser Ansatz ist nicht zu schlecht für mich, aber alle Prozessmethoden sollten privat sein. Und ich möchte sie testen. Ich sah dies question, so dass ich sie auch wenn privat testen kann, aber der erste Schritt ist, um sicherzustellen, dass es nicht besser gemacht werden konnte.

+1

Was mit Ihrem aktuellen Ansatz ist falsch? –

Antwort

1

Sie können einen Blick auf http://www.codeproject.com/Articles/455228/Design-Patterns-3-of-3-Behavioral-Design-Patterns#Chain werfen Aber vielleicht ist es eine Art Overkill für Ihre Aufgabe.

Was ich tun würde ist, process1, process2 usw. zu separaten Klassen zu extrahieren. Dann können Sie a) sie mit Unit Tests separat testen b) injizieren Sie sie in Ihre Klasse und verwenden Sie sie in process Methode in der notwendigen Reihenfolge.

Werfen Sie auch einen Blick auf diesen Beitrag: Design Pattern for a multi-step algorithm Vielleicht werden Sie einige Ideen von dort bekommen.

0

Sie können Ihre "private" Methoden als Paket geschützt angeben. Nur Klassen desselben Pakets (aber aus verschiedenen Quellordnern wie src/main/java und src/test/java oder ... aus verschiedenen Projekten) können auf diese Methoden zugreifen.

private void myPrivateMethod(){} 

würde wird

/*no visibility keyword for declaring a method package protected*/ 
void myPrivateMethod(){} 
Verwandte Themen