2016-05-16 23 views
6

Ich habe eine Verpflichtung, in dem ich eine private Methode einer abstrakten Klasse berufen habe.Hervorrufen von privaten Methoden einer abstrakten Klasse

Lassen Sie uns sagen, dass die abstrakte Klasse wie unten aussieht: -

public abstract class Base { 

    protected abstract String getName(); 

    private String getHi(String v) { 
     return "Hi " + v; 
    } 
} 

Kann einige mich wissen zu lassen, ist es eine Möglichkeit, ich getHi nennen kann (kann über Reflection oder andere Mittel sein), so dass ich es testen aus? Ich verwende Junit 4.12 und Java 8

Ich bin durch diese question gegangen, aber hier sind die Methoden nicht privat in der abstrakten Klasse.

habe ich auch durch diesen question auch diese über private Methode in der abstrakten Klasse nicht weg reden.

ich frage hier nicht, ob wir die private Methode testen soll oder nicht oder was ist die beste Strategie für private Methoden zu testen. Dafür gibt es im Internet viele Ressourcen. Ich versuche nur zu fragen, wie wir eine private Methode einer abstrakten Klasse in Java aufrufen sollen.

+0

Siehe http://stackoverflow.com/q/105007/3788176 –

+1

ich bin mir bewusst, über die Diskussion, ob wir private Methode oder nicht testen sollten. Eigentlich interessiert mich zu wissen, ob es möglich ist, eine private Methode einer abstrakten Klasse aus einem Testcode aufzurufen? – tuk

+0

Siehe http://stackoverflow.com/questions/6913325/annotation-to-make-a-private-method-public-only-for-test-classes, die einige Ansätze gibt. Insbesondere verweist [diese Antwort] (http://stackoverflow.com/a/6913775/3788176) auf das JUnit-Dokument zum Testen privater Methoden. –

Antwort

2

Ich bin in der Lage, die private Methode einer abstrakten Klasse aufzurufen, wie folgt: -

Lassen Sie uns sagen, dass ich eine Klasse, die abstrakte Basisklasse erstreckt: -

public class Child extends Base { 
    protected String getName() { 
    return "Hello World"; 
    } 
} 

Dann kann ich aufrufen die private Methode wie folgt: -

Child child = new Child(); 
try { 
     Method method = Base.class.getDeclaredMethod("getHi", String.class); 
     method.setAccessible(true); 
     String output = (String) method.invoke(child, "Tuk"); 
     System.out.println(output); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
Verwandte Themen