mockito 处理或ElseThrow

vsdwdz23  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(125)

我的方法如下所示

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
tjjdgumg

tjjdgumg1#

从您提供的代码示例来看,eRepo.findById(id)似乎返回一个Optional。

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

接收该Optional,并检查Optional是否为空。如果不是,则返回EE示例,否则抛出指定的异常。
在您的测试中,不需要调用

orElseThrow(EntityNotFoundException::new)

因为您是在显式地嘲笑findById的行为。只需这样做:

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

a9wyjsp72#

我发布这篇文章是为了帮助大家更快地找到这个问题。我需要AssertJPA存储库中.orElseThrow()中异常的消息和条件。正常情况下返回Optional.of(someDataYouAlreadyMockedUp)是显而易见的,但是要获得异常,存储库流必须获得null(Empty),因此使用Optional.empty()...
在我的代码中

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

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

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

然后这样称呼和Assert:

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

相关问题