Проверяю метод
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 и тест проходит. Что я делаю не так?
Столкнулся с такой проблемой, как получение данных из листаКазалось бы что всё просто, но вот не совсем