Получение «InvalidUseOfMatchersException», даже если оно используется правильно - PullRequest
0 голосов
/ 30 августа 2018

У меня есть следующий смоделированный объект:

@Mock
ObjectMapper objectMapper = new ObjectMapper();

Тогда я пишу какую-то насмешливую логику, утверждающую, что я делаю это неправильно:

Mockito.when(objectMapper.writeValueAsString(Mockito.anyObject())).thenThrow(JsonProcessingException.class);

Где я ошибся?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Я использую @InjectMocks для тестируемого класса и @Mock для автоматического создания и введения макетов. Это прекрасно работает для меня.

Примерно так:

@RunWith(MockitoJUnitRunner.class)
public final class ClassTest{

    @InjectMocks
    private ClassUnderTest objectOfClass;

    @Mock 
    private ObjectMapper objectMapper = new ObjectMapper();

    @Test (expected = JsonProcessingException.class)
    public void testMethod() {
        when(objectMapper.writeValueAsString(anyObject()))
       .thenThrow(JsonProcessingException.class);
    }
}

InvalidUseOfMatchersException может возникнуть, если вы не используете сопоставления для всех аргументов в вызове функции в тесте.

Как:

when(mock.doSomething(any(), someMock)).thenReturn(something); // This can generate the exception.

Вместо этого вы можете использовать:

when(mock.doSomething(any(),eq(someMock))).thenReturn(something); // Here we use eq matcher instead of simply passing the mock
0 голосов
/ 30 августа 2018

Методы сопоставления, такие как anyObject(), eq() , не возвращают сопоставители. Внутри они записывают совпадение в стек и возвращают фиктивное значение (обычно ноль). Эта реализация обусловлена ​​статической безопасностью типов, навязанной компилятором java. Следствием этого является то, что вы не можете использовать методы anyObject(), eq() вне проверенного / заглушенного метода.

Мое предложение было бы использовать any()

Например

@Test
public void TestObjectMapper() {
    //Arrange
    ObjectMapper objectMapper = mock(ObjectMapper.class);
    when(objectMapper.writeValueAsString(any()))
        .thenThrow(new JsonProcessingException());

    //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...