处理或其他抛出

Handling orElseThrow

我的方法是这样的

public EP updateEP(long id, EP eP) {
        EE eE = eRepo.findById(id).orElseThrow(EntityNotFoundException::new);
        //some code
    }

我的测试方法是这样的

    @Test
    public void testUpdateEWhenEExists() {
        long id = 1l;
        EE eE = new EE();
        eE.setPosId(1l);
        eE.setPosName("pos");
        EPE ePE = new EPE();
        ePE.setEId(id);
     when(eRepo.findById(id).orElseThrow(EntityNotFoundException::new)).thenReturn(eE);
        //some code
    }

它总是抛出 EntityNotFoundException。我想返回给我 eE 而不是 EntityNotFoundException

编辑

    @Test
    public void testUpdateEPWhenEExists() {
        long id = 1l;
        EE eE = new E();
        eE.setPositionId(1l);
        eE.setPosName("pos");
        EPE ePE = new EPE();
        ePE.setEId(id);

        when(eRepo.findById(id)).thenReturn(Optional.of(eE));
    
    }

在这种情况下错误是

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
EPE cannot be returned by findById()
findById() should return Optional

从您提供的代码示例看来,eRepo.findById(id) returns 是可选的。

eRepo.findById(id).orElseThrow(...)

接收 Optional 并基本上检查 Optional 是否为空。如果不是,它returns EE 的实例,否则它抛出指定的异常。

在你的测试中不需要调用

orElseThrow(EntityNotFoundException::new)

因为您明确地模拟了 findById 的行为。 就这样吧:

when(eRepo.findById(id)).thenReturn(Optional.of(eE));

我发布这个是为了帮助任何人更快地找到它。我需要在 JPA 存储库的 .orElseThrow() 中断言异常的消息和条件。正常情况对于 return Optional.of(someDataYouAlreadyMockedUp) 是显而易见的,但是要得到异常,存储库流必须得到一个 null (Empty) 所以使用 Optional.empty() ...

在我的代码中有

    License license = licenseRepository.findById(licenseId).orElseThrow(() ->
        new BadRequest("License " + licenseId + " not found."));

为了测试和断言测试中的值,我像这样模拟它:

when(licenseRepository.findById(1L)).thenReturn(Optional.empty());

然后像这样调用和断言:

 try {
      SomeDto result = someService.getSomeStuffByLicenseId(1L);
      fail("should have already thrown exception here!");
 }catch (BadRequest br) {
      assertEquals("License 1 not found", br.getMessage());
 }