我在互联网和stackoverflow上搜索了相当多,但没有找到一个简单的解释和区别,并添加了单元测试和集成测试之间的示例。
我读过单元测试和集成测试,我目前的理解是,一方面,对于单元测试,我们只测试方法是否为初学者运行,或者在不与其他系统交互的情况下正确运行并返回所需的输出。我的理解是,这里应该使用对象的模拟。
另一方面,对于集成测试,我们测试更复杂的情况,比如运行与数据库调用或另一个服务调用相关的方法。我的理解是,在这里不应该使用对象的模拟,而应该进行对数据库的真正调用。是这样吗?
我正在使用Java 11、Junit 5,并希望使用MySQL数据库和JPA存储库测试基本CRUD应用程序的Rest控制器(Hibernate)。我已经创建了一些单元测试,但无法创建集成测试,因为缺乏对它们之间的理解以及如何利用Junit来做这件事。我希望,如果可能的话,使用当前业务中的最佳实践,为以下方法提供一个清晰的单元和集成测试示例,并提供清晰的解释。
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/message")
@Slf4j
public class MessageController {
private final MessageService messageService;
@PostMapping("/save")
public ResponseEntity<MessageDto> saveMessage(@RequestBody MessageDto messageDto) {
messageService.saveMessage(messageService.dtoToEntity(messageDto));
log.info("In saveMessage() , saving: " + messageDto);
return ResponseEntity.ok().body(messageDto);
}
服务层
@Service
@RequiredArgsConstructor
public class MessageService {
private final MessageRepository messageRepository;
public Message saveMessage(Message message) {
return messageRepository.save(message);
}
public Message dtoToEntity(MessageDto message) {
return Message.builder()
.title(message.getTitle())
.name(message.getName())
.mail(message.getMail())
.message(message.getMessage())
.id(message.getId())
.build();
}
}
1条答案
按热度按时间lmvvr0a81#
单元测试只检查被测类(CUT)。因此,它们只检查一个检查。通常,所有依赖项都必须被模拟。
如果你的代码是基于Solid原则的,那么依赖关系应该很容易被模仿。如果不是,你必须改变你的CUT,使其可测试。
集成测试检查CUT和它们的依赖关系。因此,它们检查一个类,比如生产工作流。
您必须开始为CUT创建单元测试,然后创建集成测试。