2016-12-02 6 views
4

Попытка заглушить класс двумя возможными способами обращения/возврата с использованием пользовательского Matcher ... столкнулась с проблемой интереса.Mockito, считая stubbing как вызов

Вот тест, который я написал, чтобы показать ...

Это может быть трудно реализовать, но я бы ожидал, что первый ArgumentMatcher не вызывается, когда гася второй when(...).thenReturn(...)

Но выполнение кода ниже печатает foobar на stdout. Есть ли что-то, что мы можем сделать, чтобы предотвратить такое поведение? Или я использую неправильный шаблон, пытаясь окурок один макет с несколькими обычая ArgumentMatcher

FYI - powermock на моем пути к классам для других тестов (не уверен, если это имеет значение, но я вижу в трассировке стека)

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 добавил, чтобы проиллюстрировать

ответ

4

Если вы используете doReturn() синтаксис, то метод не называется.

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

См. this answer для получения более подробной информации. Кроме того, the docs объяснить это потребительной дело (курсив мой):

Вы можете использовать doReturn(), [...] вместо соответствующего вызова с тем, когда(), для любого метода. Это необходимо, если вы:

  • заглушки недействительные методы
  • методы заглушек на объектах шпиона (см ниже)
  • окурка тот же метод более чем один раз, чтобы изменить поведение издеваться в середине тест.
+1

спасибо за это – echen