У меня есть метод, использующий Spring Data. Метод findById () JPA должен возвращать Optional. Однако, если сущность не найдена по указанному идентификатору, она возвращает ноль вместо пустого необязательного.
public TicketEntity findTicket(String ticket) throws EntityNotFoundException {
Optional<TicketEntity> op = ticketEntityRepository.findById(ticket);
TicketEntity ticketEntity = op.orElseThrow(() -> new EntityNotFoundException("ticket with the id " + ticket + " not found in the system"));
return ticketEntity;
}
Во время отладки я обнаружил, что значение op равно нулю. Это фрагмент кода, который дает сбой. Я использую Spring Data JPA 2.0.8.RELEASE. Пожалуйста помоги
Код @YCF_L генерируется данными Spring jpa
findById () - это метод, определенный Spring-data-jpa. Я не определил этот метод
ой, мой плохой @gagansingh, извините, я думал, что OP создаст его вручную
посмотрите документы о допустимости пустых значений
Предоставьте воспроизводимый тестовый пример и сообщите об ошибке. Этого не должно происходить.
Это в реальной системе или во время тестирования с фиктивными зависимостями.
@ M.Deinum Это не живая система. Я пытаюсь запустить тесты с фиктивными зависимостями
И null - это ответ по умолчанию для имитации. Вам нужно будет сказать макету, что он должен вернуть Optional.empty().
@ M.Deinum Вы должны опубликовать этот комментарий в качестве ответа, потому что это основная причина. Я изменил макет, чтобы вернуть Optional.empty (), и он работал как шарм. Большое спасибо за твою помощь. Я действительно ценю это.
Предполагая, что вы используете Mockito, он должен фактически вернуть пустой необязательный параметр. Какую версию Spring Boot и Mockito вы используете? См. github.com/mockito/mockito/issues/1416#issuecomment-40115325 4
проверьте это решение: stackoverflow.com/a/49967692/5872337




Строка кода
Необязательный op = ticketEntityRepository.findById (билет);
вернуть список набора результатов, если данные существуют в системе, в противном случае очевидно, что он вернет ноль вместо пустого необязательного. Если вам нужен пустой необязательный список, вы можете его покрутить следующим образом
Список op = ticketEntityRepository.findById (тикет) .orElse (новый ArrayList ());
так что метод findById должен возвращать объект или null, тогда зачем возвращать необязательный? вот в чем вопрос.
Какова реализация вашего класса репозитория? У меня работает следующий репозиторий и тестовый пример.
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonRepoTest {
@Autowired
private PersonRepository personRepository;
@Test
public void testFindById(){
Optional<Person> byId = personRepository.findById(1);
Assert.assertTrue(byId != null);
}
}
public interface PersonRepository extends CrudRepository<Person, Integer> {
}
В комментарии вы заявляете, что это тест с фиктивными зависимостями. Мокинг полностью исключает Spring Data JPA из картинки, поскольку теперь это просто прокси, реализованный с помощью макета из Mockito.
По умолчанию макет возвращает null.
By default, for all methods that return a value, a mock will return either null, a primitive/primitive wrapper value, or an empty collection, as appropriate. For example 0 for an int/Integer and false for a boolean/Boolean.
Поскольку вы работаете с макетом, вам нужно будет указать ему вернуть Optional.empty(), иначе вы получите null.
ПРИМЕЧАНИЕ: Вы можете создать запрос на улучшение для Mockito, чтобы по умолчанию возвращался Optional.empty в случае типа возврата Optional.
Как бы вы его проинструктировали? Учитывая пример строки кода: Mockito.when (repository.findById (Mockito.any ()). OrElse (null) ) .thenReturn (myValue);
похоже значит? Синтаксис?