如何处理终结点单元测试上的 UserNotFound 异常?



我正在开发一个带有用户实体的 Spring boot CRUD RESTful API,该 API 由两个参数组成:nameid。我的测试框架是JUnit

我面临的问题是我不知道如何处理服务单元测试中可抛出的UserNotFound异常。

如您所见,在我的"按 id 列出用户"、">按 id 删除用户"和"按id 更新用户"中,我可能有"{id} 找不到用户">异常(我只会列出两个端点以缩短时间(:

@Service
public class DeleteUserService {
@Autowired
UserRepository repository;
public void deleteUser(Long id) {
Optional<User> userOptional = repository.findById(id);
if (!userOptional.isPresent()) {
throw new UserNotFoundException(id);
} else {
repository.deleteById(id);
}
}
}
@Service
public class DetailUserService {
@Autowired
UserRepository repository;
public Optional<User> listUser(Long id) {
Optional<User> user = repository.findById(id);
if (!user.isPresent()) {
throw new UserNotFoundException(id);
} else {
return repository.findById(id);
}
}
}

到目前为止没有任何问题,我的端点工作正常。UserNotFound代码是 :

@ControllerAdvice
public class UserNotFoundAdvice {
@ResponseBody
@ExceptionHandler(UserNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
String userNotFoundHandler(UserNotFoundException ex) {
return ex.getMessage();
}
}
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException(Long id) {
super("Could not find user with id " + id + ".");
}
}

单元测试(编写此内容的主要原因(:

@RunWith(MockitoJUnitRunner.class)
public class DeleteUserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private DeleteUserService deleteUserService;
@Test
public void whenGivenId_shouldDeleteUser_ifFound(){
User user = new User();
user.setId(89L);
deleteUserService.deleteUser(user.getId());
verify(userRepository).deleteById(user.getId());
}
}
@RunWith(MockitoJUnitRunner.class)
public class DetailUserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private DetailUserService detailUserService;
@Test
public void whenGivenId_shouldReturnUser_ifFound() {
User user = new User();
user.setId(89L);
Optional<User> userMock = Optional.of(user);
when(userRepository.findById(user.getId())).thenReturn(userMock);
Optional<User> expected = detailUserService.listUser(user.getId());
assertThat(expected).isSameAs(userMock);
verify(userRepository).findById(user.getId());
}
}

如您所见,这些单元测试代码中缺少一些东西,即UserNotFound的行为。也许它没有被正确模拟或单元测试代码中缺少其他内容?

如果有人能帮我解决这个问题,将不胜感激!对不起,如果帖子太长,我尽力解释!

如果我理解正确,您需要在找不到用户并抛出异常时测试行为。

以下是有关如何测试异常的链接:https://www.baeldung.com/junit-assert-exception

此外,您还可以验证是否未调用按 id 删除或按 id 查找:

verify(userRepository, never()).findById(user.getId()); 
or
verify(userRepository, Mockito.times(0)).findById(user.getId());

对于删除ById相同

若要测试异常处理程序是否已调用并正常工作,您需要集成测试。

最新更新