Spring Boot 保存方法的单元和集成测试(带数据库)

gwo2fgha  于 2022-11-29  发布在  Spring
关注(0)|答案(1)|浏览(127)

我在互联网和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();
    }
}
lmvvr0a8

lmvvr0a81#

单元测试只检查被测类(CUT)。因此,它们只检查一个检查。通常,所有依赖项都必须被模拟。
如果你的代码是基于Solid原则的,那么依赖关系应该很容易被模仿。如果不是,你必须改变你的CUT,使其可测试。
集成测试检查CUT和它们的依赖关系。因此,它们检查一个类,比如生产工作流。
您必须开始为CUT创建单元测试,然后创建集成测试。

相关问题