2015-09-22 2 views
3

Мне нужно проверить метод с несколькими параметрами в Mockito, но нужно зафиксировать только один аргумент, а другим мне нужен только простой помощник. Это возможно?Можно ли смешивать Argument Captor и регулярный совпадение?

Например, если у меня есть:

@Mock 
private Map<K,V> mockedMap; 
... 
ArgumentCaptor<K> argument = ArgumentCaptor.forClass(K.class); 
verify(mockedMap).put(argument.capture(), any(V.class)); 

В этом случае мне нужно написать захватчик для каждого аргумента, несмотря на то, мне нужно, чтобы захватить только первый аргумент?

ответ

10

В этом случае мне нужно написать запись для каждого аргумента, несмотря на то, что мне нужно записать только первый аргумент?

durron597's answer правильно-вам не нужно захвата все аргументы, если вы хотите, чтобы захватить один из них. Одна точка уточнения: вызов ArgumentCaptor.capture() считается совпадением Mockito и в Mockito, если вы используете совпадение для любого аргумента метода you do have to use a matcher for all arguments.

Для метода yourMock.yourMethod(int, int, int) и ArgumentCaptor<Integer> intCaptor:

/* good: */ verify(yourMock).yourMethod(2, 3, 4); // eq by default 
/* same: */ verify(yourMock).yourMethod(eq(2), eq(3), eq(4)); 

/* BAD: */ verify(yourMock).yourMethod(intCaptor.capture(), 3, 4); 
/* fixed: */ verify(yourMock).yourMethod(intCaptor.capture(), eq(3), eq(4)); 

Они также работают:

verify(yourMock).yourMethod(intCaptor.capture(), eq(5), otherIntCaptor.capture()); 
verify(yourMock).yourMethod(intCaptor.capture(), anyInt(), gt(9000)); 
+0

Это действительно полезно :) – simomo

2

Конечно, это работает. Почему бы и нет?

import java.util.Map; 

import org.junit.*; 
import org.mockito.*; 

import static org.mockito.Mockito.*; 
import static org.junit.Assert.*; 

public class MockitoTest { 
    @Mock 
    private Map<Integer, String> mockedMap; 

    @Before 
    public void setup() { 
    MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void testCaptor() { 
    mockedMap.put(5, "Hello World!"); 
    ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class); 
    verify(mockedMap).put(argument.capture(), any(String.class)); 

    assertEquals(5L, argument.getValue().longValue()); 
    } 
} 

Это работает правильно и проходит.


Как и в сторону, вы почти никогда не хотите, чтобы дразнить структуры данных, такие как List и Map, потому что это гигантская боль правильно издеваться все их поведение и большая часть кода не будет очень рад, если вы, например, , добавьте элемент, а затем элемент фактически не существует. В вашем случае, вероятно, было бы лучше создать частичный макет (используя Mockito.spy), чем фактический макет.

Смежные вопросы