Используя Mockito, как проверить пару ключ-значение на карте в предложении when - PullRequest
0 голосов
/ 24 января 2019

Ссылка на: Аналогичный вопрос1 , Аналогичный вопрос2 , Аналогичный вопрос3

Из этой ссылки мне удалось вывести частичное решение следующим образом, хотя оно синтаксически неверно. Как мне изменить это, чтобы правильно искать определенные ключи с нулевыми значениями.

when(storedProc.execute(anyMapOf(String.class, Object.class).allOf(hasEntry("firstIdentifier", null), hasEntry("secondIdentifier", null))))
   .thenThrow(new Exception(EXCEPTION_NO_IDENTIFIER));

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Проблема в том, что anyMap возвращает карту, а не сопоставителя. Поэтому замените ваш anyMap(...)... на:

Mockito.argThat(CoreMatchers.allOf(
  hasEntry("firstIdentifier", null), 
  hasEntry("secondIdentifier", null)))

Может быть, вам нужно добавить несколько подсказок переменных типа, чтобы они компилировались.

0 голосов
/ 25 января 2019

В вашем случае вы можете использовать eq с предоставленной заполненной картой:

    when(storedProc.execute(Mockito.eq(givenIncorrectMap)))
            .thenThrow(new Exception(EXCEPTION_NO_IDENTIFIER));

Полный пример:

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.Mockito;

import static org.mockito.Mockito.when;

public class QuestionTest {
    @Rule
    public ExpectedException exception = ExpectedException.none();

    interface A {
        String execute(Map<String, Object> map);
    }

    @Test
    public void test() {
        // Given a map with missed identifiers.
        final Map<String, Object> givenIncorrectMap = new HashMap<>();
        givenIncorrectMap.put("firstIdentifier", null);
        givenIncorrectMap.put("secondIdentifier", null);

        // Given a mocked service
        final A mockedA = Mockito.mock(A.class);

        // which throws an exception exactly for the given map.
        when(mockedA.execute(Mockito.eq(givenIncorrectMap)))
                .thenThrow(new IllegalArgumentException("1"));


        // Now 2 test cases to compare behaviour:


        // When execute with correct map no exception is expected
        mockedA.execute(Collections.singletonMap("firstIdentifier", "any correct value"));

        // When execute with incorrect map the IllegalArgumentException is expected
        exception.expect(IllegalArgumentException.class);
        exception.expectMessage("1");

        mockedA.execute(givenIncorrectMap);
    }
}
...