你如何用 delete 方法 void 断言

How do you assert with delete method void

我正在使用 Mockito 对 Spring 引导网络应用程序进行单元测试。我的方法之一是返回 void,但如果我尝试对其进行测试,则会出现编译错误。

这是我写的测试:

public void testDeleteActor()throws NetflixException {
    when(actorRepository.findById(1L)).thenReturn(Optional.of(Mockito.any(Actor.class)));
    assertEquals(null, service.deleteActorById(Mockito.anyLong());
}

这是我要测试的方法:

@Override
public void deleteActorById(Long id) throws NetflixException {
    Actor actor = actorRepository
        .findById(id)
        .orElseThrow(() -> new NotFoundException("Actor id not found - " + id));
    actorRepository.delete(actor);
}

如您在以下屏幕截图中所见,我的 assertEquals() 语句出现错误:

在您的代码中,您的方法实际上并没有返回 null,它没有返回任何内容 (void)。这意味着您不能根据方法 returns 编写断言。这就是 assertEquals() 语句给您错误的原因。

您可以测试方法的预期行为,而不是测试方法 returns。在这个例子中,我们期待三件事:

  1. 该方法应通过 ID 检索演员。
  2. 如果没有找到具有给定 ID 的演员,该方法应该抛出异常。
  3. 如果找到演员,该方法应该将其删除。

要实施这些测试,您可以使用 Mockito's verify() and AssertJ's assertThatExceptionOfType()。例如:

@Test
void deleteActorById_retrievesActorByID() {
    Actor actor = new Actor();
    when(actorRepository.findById(1L)).thenReturn(Optional.of(actor));
    service.deleteActorById(1L);
    verify(repository).findById(1L);
}

@Test
void deleteActorById_throwsExceptionIfIDNotFound() {
    assertThatExceptionOfType(NotFoundException.class)
        .isThrownBy(() -> service.deleteActorById(1L))
        .withMessage("Actor id not found - 1");
}

@Test
void deleteActorById_deletesActorIfIDFound() {
    Actor actor = new Actor();
    when(actorRepository.findById(1L)).thenReturn(Optional.of(actor));
    service.deleteActorById(1L);
    verify(actorRepository).delete(actor);
}