Тестировние с Mockito объясните на пальцах

449
29 декабря 2016, 07:01

Проверяю метод

public Message findOne(Long id) {
    Message message = messageRepository.findOne(id);
    if (message == null) {
        throw  new DataNotFoundException("Data with id=" + id + " not found.");
    }
    return message;
}

тест вариант 1, проходит даже если в проверяемом методе заменить DataNotFoundException на NullPointerException. Не должен вроде?

@Test(expected = DataNotFoundException.class)
public void findOneIsNullThenException1() {
    when(messageServiceImp.findOne(2L)).thenThrow(DataNotFoundException.class);
    Message testMessage = messageServiceImp.findOne(2L);
}

Тест вариант 2, не проходит ни как

@Test(expected = DataNotFoundException.class)
public void findOneIsNullThenException() {
    //prepare
    when(messageServiceImp.findOne(2L));
    then(caughtException())
            .isInstanceOf(DataNotFoundException.class)
            .hasMessageContaining("Data with id=2 not found.");
// А так же пробовал с
    thenThrown(DataNotFoundException.class);
}

получаю ошибку

java.lang.Exception: Unexpected exception, expected<com.sttech.springrest.exception.DataNotFoundException> but was<java.lang.AssertionError>
....
Caused by: java.lang.AssertionError: 
Expecting actual not to be null
....
E.g. thenReturn() may be missing.
Examples of correct stubbing:
when(mock.isOk()).thenReturn(true);
when(mock.isOk()).thenThrow(exception);
doThrow(exception).when(mock).someVoidMethod();
Hints:
 1. missing thenReturn()
 2. you are trying to stub a final method, you naughty developer!
 3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed

Дополнение:

Я что то перестал понимать как вообще тестировать с помощью mockito. У меня есть класс MessageServiceImp в нем есть методы которые я хочу протестировать. Буду отталкиваться все от того же метода что выше, но протестировать его не только на исключения.

В классе MessageServiceImp есть зависимость MessageRepository которую надо проинжектировать, по этому отмечаем ее как мок и инжектируем в класс.

@Mock
private MessageRepository messageRepository;
@InjectMocks
MessageServiceImp messageServiceImp;

Далее сам тест.

@Test
public void findOne() throws Exception {
    //prepare
    when(messageRepository.findOne(ID)).thenReturn(MESSAGE);
    //testing
    Message testMessage = messageServiceImp.findOne(ID);
    //validate
    verify(messageRepository).findOne(ID);
}

В таком виде тест проходит, смотрим а что он там вообще тестирует, вроде как должен вызов метода findOne и вернуть должен объект MESSAGE (по сути мне бы подошел и возврат любого объекта anyObject() ) Проверяем, меняем в проверяемом методе возвращаемое значение на null и ... тест все равно проходит, я ведь объект ожидаю, а получаю null и тест проходит. Что я делаю не так?

READ ALSO
ArrayList. Доступ к элементу. Не всё так просто

ArrayList. Доступ к элементу. Не всё так просто

Столкнулся с такой проблемой, как получение данных из листаКазалось бы что всё просто, но вот не совсем

579
Как получить слово после знака &ldquo;?&rdquo;

Как получить слово после знака “?”

Как мне получить слово Izzume?

505