2016-12-02 2 views
4

Der Versuch, eine Klasse mit 2 möglichen Aufruf/Rückweg mit benutzerdefinierten Matcher stub ... lief ein Interesse Problem. HierMockito Stubbing zählen als Aufruf

ist ein Test, den ich schrieb zu illustrieren ...

Dies schwierig sein könnte, zu implementieren, aber ich würde das erste ArgumentMatcher erwartet wird nicht aufgerufen, wenn die zweite when(...).thenReturn(...)

stubbing

Aber laufen Sie den Code unten druckt foobar auf stdout. Können wir etwas gegen dieses Verhalten tun? Oder bin ich mit dem falschen Muster, indem Sie versuchen eine einzige Mock mit mehreren benutzerdefinierten ArgumentMatcher

FYI Stub - powermock ist auf meinem Classpath für andere Tests (nicht sicher, ob das Fragen, aber ich sehe in dem Stack-Trace)

import org.junit.Test; 
import org.mockito.ArgumentMatcher; 

import java.io.File; 
import java.io.FilenameFilter; 

import static org.mockito.Matchers.*; 
import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.when; 

public class MyTest { 
    @Test 
    public void name() throws Exception { 
     File file = mock(File.class); 
     when(file.list(argThat(new ArgumentMatcher<FilenameFilter>() { 
      @Override 
      public boolean matches(Object argument) { 
       System.out.println("foobar"); 
       return 1 + 1 >2; 
      } 
     }))).thenReturn(null); 
     // at this point, mockito will attempt to run the previous matcher, treating this stub code as invocation ... and printing out 'foobar' 
     when(file.list(argThat(new ArgumentMatcher<FilenameFilter>() { 
      @Override 
      public boolean matches(Object argument) { 
       System.out.println("barbar"); 
       return true; 
      } 
     }))).thenReturn(null); 

    } 
} 

EDIT hinzugefügt Kommentare

Antwort

4

erläutern helfen Wenn Sie die doReturn() Syntax verwenden, dann wird die Methode nicht aufgerufen.

doReturn(null).when(file).list(argThat(new ArgumentMatcher<FilenameFilter>() { 
    @Override 
    public boolean matches(Object argument) { 
     System.out.println("barbar"); 
     return true; 
    } 
})); 

Weitere Informationen finden Sie unter this answer. Außerdem erklären the docs diesen Anwendungsfall (Hervorhebung von mir):

Sie verwenden doReturn(), [...] anstelle des entsprechenden Anruf mit, wenn() für jede Methode. Es ist notwendig, wenn Sie:

  • Stub Leere Methoden
  • Stub Methoden auf Spion Objekte (siehe unten)
  • Stub die gleiche Methode mehr als einmal, um das Verhalten eines Mock in der Mitte zu ändern ein Test.
+1

vielen Dank dafür – echen