2016-03-23 1 views
2

Ich fand meine Methode ReflectionUtilsWie Mockito.given mit privaten Methode

Method myMethod=ReflectionUtils.findMethod(myMockClass.getClass(), "myMethod", myArg.class) 

Jetzt anrufen würde Ich mag diese Methode fahren einen bestimmten Wert zurückzukehren. Normalerweise, wenn myMethod Öffentlichkeit wäre würde ich für

Beispiel schreiben
given(myMockClass.myMethod(myArg)).willReturn(5) 

Aber gibt es eine Möglichkeit, es mit eigenem myMethod zu tun?
Wenn ich habe

genannt
given(myMethod.invoke(myClass, myArg)).willReturn(5)  

ich java.lang.reflect.InvocationTargetException habe. Ich habe über PowerMock gelesen, aber ich würde gerne wissen, ob es mit Mockito möglich ist, nur

Edit:

public int A(args){ 
    int retValue; 
    ... some code here, the most important part 
    retValue=.. 
    if(some case) 
     retValue= myMethod(args); 
    return retValue; 
} 
+0

Zunächst einmal, welche Klasse wollen Sie testen? Klasse, die 'A' Methode enthält? Was macht "myMethod"? Ich meine, wie nennt die Methode die andere Klasse? Verwendet es "neue" oder statische Anrufe? –

Antwort

1

Ich würde Ihnen empfehlen, es nicht zu tun. Wenn Sie Verhalten der privaten Methode verspotten müssen, dann haben Sie Probleme mit Ihrem Design. Ihre Klasse ist nicht testbar.

Als Abhilfe können Sie Ihr Methodenpaket als vertraulich definieren und es im selben Paket testen. Dies funktioniert, wird aber auch nicht als gute Praxis angesehen.

Ich würde empfehlen, dies zu lesen neueste Uncle's bob article

+0

Vielen Dank für Ihren Kommentar, ich werde es berücksichtigen. Meine Situation folgt (bearbeiten), ich habe Methode A, wo sind ein paar Funktionalitäten und innerhalb dieser Methode rufe ich myMethod in einem Fall. myMethod ist privat und ruft eine andere Klasse auf. Ich möchte Unit-Test schreiben, damit ich mich nicht darauf konzentrieren möchte, was in dieser anderen Klasse passiert, weil es anders ist. In diesem Fall möchte ich etwas Wert zurückgeben. – adolzi

+0

Vielleicht irre ich mich, aber nehmen wir ein Beispiel, dass wir eine Klasse haben, wo wir viele Dinge tun, einschließlich MethodeA, wo wir einen Wert mit bestimmten Algorithmus berechnen, diese MethodeA ist privat, und dann ist es in Ordnung, dass wir nur das testen Algorithmus – adolzi

1

Zögern Sie nicht, die Methode Sichtbarkeit zu ändern geschützt zu verpacken, auch wenn es nur für Testzwecke ist (in der Regel, weil Sie die Methode testen wollen oder weil Sie wollen verspotten Sie es). Sie sollten dies jedoch deutlich angeben, indem Sie eine Anmerkung verwenden (siehe this answer).

2

Verwenden Sie Guava's @VisibleForTesting Annotation hier. Im Grunde, erhöhen Sie einfach die Sichtbarkeit der Methode auf das minimale Niveau, das notwendig ist, um es zu testen.

Zum Beispiel, wenn Ihre ursprüngliche Methode ist:

private int calculateMyInt() { 
    // do stuff 
    return 0; 
} 

Ihre neue Methode wäre:

@VisibleForTesting // package-private to call from test class. 
int calculateMyInt() { 
    // do stuff 
    return 0; 
} 
+0

Interessant. habe ich noch nie zuvor gesehen. Vielen Dank! –