2016-06-02 4 views
0

Ich möchte überprüfen, ob eine private Methode meiner Klasse ausgeführt wird oder nicht powermockito verwendet.Verwenden Sie Powermockito, um zu überprüfen, ob eine private Methode aufgerufen wird oder nicht

Angenommen, dass ich diese Klasse zu testen:

public class ClassToTest { 
    public boolean methodToTest() { 
     //doSomething (maybe call privateMethod or maybeNot) 
     return true; 
    } 

    //I want to know if this is called or not during the test of "methodToTest". 
    private void privateMethod() { 
     //do something 
    } 
} 

Wenn ich teste „methodToTest“ Ich prüfen wollen, ob es das richtige Ergebnis liefert, sondern auch, wenn es führt die private Methode „privateMethod“ ist oder nicht. Suche auf andere Diskussion Ich schrieb diesen Test, der powermotorito verwendet, aber es funktioniert nicht.

public class TestClass { 

    @Test 
    testMethodToTest(){ 
     ClassToTest instance = new ClassToTest(); 
     boolean result = instance.methodToTest(); 
     assertTrue(result, "The public method must return true"); 

     //Checks if the public method "methodToTest" called "privateMethod" during its execution. 
     PowerMockito.verifyPrivate(instance, times(1)).invoke("privateMethod"); 
    } 
} 

Wenn ich den Debugger verwenden, scheint es, dass die letzte Zeile (PowerMockito.verifyPrivate ...) prüft nicht, ob die private Methode während des Tests einmal ausgeführt worden ist, sondern scheint es, dass es die private ausführt Methode selbst. Außerdem übergibt der Test, aber mit dem Debugger bin ich mir sicher, dass die private Methode beim Aufruf von "instance.methodToTest()" nicht ausgeführt wird. Was ist los?

+0

Sie versuchen, eine reale Instanz einer Klasse zu verifizieren, nicht eine falsche! –

+0

Uhm ich habe was verpasst, was ist der richtige Weg, es zu tun? Ist es richtig, das Verhalten eines Mocks zu testen? Ich vermutete, dass die Mock-Objekte nur dazu verwendet wurden, die Referenzen zu verbergen, die die zu testende Klasse mit anderen Objekten hat, und dass die Instanz der zu testenden Klasse eine echte sein sollte. – user2572526

+0

Warum interessiert es dich, wenn es heißt? Der ganze Test sollte sich darum kümmern, ob die öffentliche Methode das Richtige tut und sich nicht darum kümmern sollte, ob bestimmte private Methoden aufgerufen werden. –

Antwort

1

Ich würde es einfacher machen, ohne PowerMockito. Betrachten Sie diese (es ist eine Art von Spy Objekt):

public class TestClassToTest { 

    private boolean called = false; 

    @Test 
    public void testIfPrivateMethodCalled() throws Exception { 
     //given 
     ClassToTest classToTest = new ClassToTest() { 
      @Override 
      void privateMethod() { 
       called = true; 
      } 
     }; 

     //when 
     classToTest.methodToTest(); 

     //then 
     assertTrue(called); 
    } 
} 

Dies erfordert privateMethod() Wechsel zu verpacken-private (aber es gibt nichts falsch mit diesem).

Aber bedenken Sie, dass die Implementierung von Tests eine schlechte Praxis ist und zu fragilen Tests führen kann. Stattdessen sollten Sie nur Ergebnisse testen.

Verwandte Themen