2017-01-26 4 views
0

Ich möchte eine Methode meiner Klasse mit Mockito testen.Gespiegelte Methode gibt keinen erwarteten Wert zurück

public class SplashPresenter { 
    public volatile State mField1 = State.DEFAULT; 
    public volatile State mField2 = State.DEFAULT; 

    boolean stateFlagsAreAllCompleted(@NonNull final ISplashView view) { 
     if (mField1 == State.COMPLETE // 
       && mField2 == State.COMPLETE) { 

      // Check Forced Update 
      final int updateCheckResult = checkForcedUpdate(); // <=== 
      if (updateCheckResult == MyConstants.PRODUCTION_UPDATE_AVAILABLE) { 
       view.displayForcedUpdateAlert(false); 
       return true; 
      } 

      if (updateCheckResult == MyConstants.BETA_UPDATE_AVAILABLE) { 
       view.displayForcedUpdateAlert(true); 
       return true; 
      } 

      view.restartLoader(); 
      // Move to the home screen 
      return true; 
     } 

     return false; 
    } 

    int checkForcedUpdate() { 
    ...... // my codes 
    } 
} 

und das ist mein Test-Klasse:

public class SplashPresenterTest_ForStateFlags { 

    private Context mContext; 
    private ISplashView mView; 

    @Before 
    public void setUp() throws Exception { 
     mContext = Mockito.mock(Context.class); 
     mView = Mockito.mock(ISplashView.class); 
    } 

    @Test 
    public void stateFlagsAreAllCompleted() throws Exception { 
     SplashPresenter presenter = Mockito.mock(SplashPresenter.class); 
     presenter.mField1 = State.COMPLETE; 
     presenter.mField2 = State.COMPLETE; 

     when(presenter.checkForcedUpdate()).thenReturn(1); 

     boolean actual = presenter.stateFlagsAreAllCompleted(mView); 
     System.out.println("actual: " + actual + ", " + 
       presenter.mField1 + ", " + 
       presenter.checkForcedUpdate()); 
     assertTrue(actual); 
    } 
} 

Test-Versagen ist das, was am Ende passiert :(Dies ist die Ausgabe:

tatsächlich: false, COMPLETE, 1

Die Sache, die ich nicht verstehe, ist sogar ich ändere die stateFlagsAreAllCompleted Methode zu foll Ausfallscode scheitert dann noch Test mit obiger Ausgabe.

boolean stateFlagsAreAllCompleted(@NonNull final ISplashView view) { 

    return true; 
} 

So würde jede Empfehlung geschätzt werden. Vielen Dank.

Antwort

1

Sie haben das Verhalten für die Methode stateFlagsAreAllComplete noch nicht verspottet. Sie tun müssen:

when(presenter.stateFlagsAreAllComplete(Matchers.any()).thenReturn(true); 

Sie die Feinabstimmung kann die Matchers.any() Argument für den Klassentyp Sie wollen.

EDIT: Ich sehe, dass Sie versuchen, testen Sie die Methode stateFlagsAreAllComplete. Da Sie versuchen, die Methode stateFlagsAreAllComplete der Klasse SplashPresenter zu testen, können Sie dies nicht tun, indem Sie die Klasse verspotten, deren Methode getestet wird. Sie müssen mit einer Instanz der Klasse arbeiten. Mocked-Methoden sollten nur während des Tests verwendet werden, wenn sie in einer anderen Testmethode aufgerufen werden.

Sie müssen eine Instanz der Klasse erstellen, die Sie testen möchten.

+0

Eigentlich möchte ich die Ausgabe von 'stateFlagsAreAllComplete()' basierend auf verschiedenen Bedingungen (die innerhalb der Methode entworfen haben) testen. Auf diese Weise kann ich die Ausgabe nicht bewerten. – Hesam

+0

Ich sehe das Problem jetzt - Sie verspotten die Klasse, deren Methode Sie testen. Sie sollten die zu testende Klasse nicht verspotten (vereitelt den Zweck des Testens). Sie sollten nur Abhängigkeiten vortäuschen. Erstellen Sie eine Instanz der Klasse und testen Sie sie anschließend. Ich aktualisiere meine Antwort – ucsunil

+0

ah, das wusste ich nicht. Danke für deine Antwort. – Hesam

Verwandte Themen