Wie um zu testen, void-Methode mit private Methode aufruft, mit Mockito

Habe ich das folgende Stück code

public class A extends B {
private boolean workDone = false;
@Override
public void publicMethod(boolean flag) {
  if (!workDone) {
    privateMethod();
    workDone = true;
  }
  super.publicMethod(flag);
 }
 private void privateMethod() {
  //some logic here
 }
}

Ich bin neu zu verspotten. Ich habe folgenden Zweifel. Ich versuche zu testen, die öffentliche Methode.

  1. ist es mir möglich, zu behaupten, der Wert der privaten variable workDone?
  2. ist es möglich zu überprüfen, der den Aufruf der Methode in der super-Klasse?
  3. Wie kann ich verspotte die private Methode aufrufen in der Methode?
InformationsquelleAutor Ankit | 2017-06-14



3 Replies
  1. 2

    Wenn Sie wirklich wollen, um es zu überprüfen, Sie brauchen, um Ihre Klasse und extrahieren Sie die super-Aufruf in eine private Methode:

    public class A extends B {
    
        private boolean workDone = false;
    
        @Override
        public void publicMethod(final boolean flag) {
            if (!workDone) {
                privateMethod();
                workDone = true;
            }
            callParentPublicMethod(flag);
        }
    
        private void callParentPublicMethod(final boolean flag) {
            super.publicMethod(flag);
        }
    
        private void privateMethod() {
            System.out.println("A: privateMethodCalled");
        }
    }

    nachdem dies getan ist, können Sie verwenden, PowerMock, um zu überprüfen, private Methode aufrufen:

      import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.powermock.api.mockito.PowerMockito;
    import org.powermock.core.classloader.annotations.PrepareForTest;
    import org.powermock.modules.junit4.PowerMockRunner;
    
    @RunWith(PowerMockRunner.class)
    @PrepareForTest({ A.class })
    public class ATest {
    
        @Test
        public void publicMethod_test_false() throws Exception {
    
            A spy = PowerMockito.spy(new A());
            spy.publicMethod(false);
            PowerMockito.verifyPrivate(spy).invoke("privateMethod");
            PowerMockito.verifyPrivate(spy).invoke("callParentPublicMethod", false);
        }
    
        @Test
        public void publicMethod_test_true() throws Exception {
    
            A spy = PowerMockito.spy(new A());
            spy.publicMethod(true);
            PowerMockito.verifyPrivate(spy).invoke("privateMethod");
            PowerMockito.verifyPrivate(spy).invoke("callParentPublicMethod", true);
        }
    }

    Hoffe, das hilft.

    • Sorry, es war ein Fehler im code, die ich aktualisiert, jetzt eben. Die if-Bedingung in der Methode getestet werden, hängt von der privaten variable.
    • siehe angepasste Antwort…
  2. 0

    Wenn dabei unittesting überprüfen wir die öffentlich beobachtbare Verhalten der code unter test. Dies ist die Rückgabewerte geliefert durch den SCHNITT und seine Kommunikation mit Abhängigkeiten.

    Den privaten Variablen und privaten Methoden im SCHNITT werden Implementierungsdetails wir nicht wollen, um zu testen (explizit), weil wir wollen, dass Sie veränderbar sein, ohne Bremsen zu unserem test.

    In seltenen Fällen der Aufruf der super-Klasse Methoden können als „Kommunikation mit der Abhängigkeit“. In diesem Fall erstellen Sie eine spy() des Schnittes. Aber in der Regel sollte dies berücksichtigt werden detail zu…

  3. 0
    1. Nicht. Private Variablen können nicht zugegriffen werden, in anderer Weise als über die Reflexion. Das ist in der Regel nicht bevorzugt, insbesondere in unit-tests.
    2. Ja, vorausgesetzt, Sie bekommen einige assertable ändern tun, um super-Klasse-Methode aufrufen. Wie die änderung in der boolean flag
    3. Ja, Sie können mit powermockito. Für mehr siehe hier.
      Testen Private Methode mit mockito

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.