gpt4 book ai didi

java - 如何处理端点单元测试中的 UserNotFound 异常?

转载 作者:行者123 更新时间:2023-12-01 16:15:08 25 4
gpt4 key购买 nike

我正在开发一个 Spring Boot CRUD RESTful API,其中包含一个 User 实体,该实体由两个参数组成:nameid。我的测试框架是JUnit

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

我的“按 ID 列出用户”“按 ID 删除用户”中可能存在“{id} 未找到用户” 异常 em> 和 “通过 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());

和deleteById相同

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

关于java - 如何处理端点单元测试中的 UserNotFound 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62419400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com