我有一个利用Spring Data的方法,JPA的findById()方法应该返回Optional。但是,如果指定的ID未找到该实体,则它将返回 null ,而不是Empty 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。请帮助
答案 0 :(得分:1)
您的存储库类的实现是什么?以下存储库和测试用例对我有用。
@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> {
}
答案 1 :(得分:1)
在注释中,您声明这是在具有模拟依赖项的测试中。该模拟完全使Spring Data JPA脱颖而出,因为它现在只是由Mockito的模拟实现的代理。
模拟的默认行为是返回null
。
默认情况下,对于所有返回值的方法,模拟将酌情返回null,原始/原始包装器值或空集合。例如,对于int / Integer为0,对于boolean / Boolean为false。
在运行模拟程序时,您将需要指示它返回Optional.empty()
,否则您将获得null
。
注意:对于Optional.empty
返回类型,您可能想创建一个改进请求,以使Mockito默认返回Optional
。
答案 2 :(得分:-3)
代码行
可选op = ticketEntityRepository.findById(ticket);
如果系统中存在数据,则返回结果集列表,否则很明显它将返回null而不是空的optional。 如果您需要一个空白的可选列表,可以按照以下说明进行扭曲
列表op = ticketEntityRepository.findById(ticket).orElse(new ArrayList());