繁体   English   中英

Spring Boot 服务层:单元测试还是集成测试?

[英]Spring Boot service layer: Unit or Integration tests?

我有一个服务:

@Service
@Transactional
@RequiredArgsConstructor
public class BookService {

    private final BookRepository bookRepository;

    public Book findOne(Long id) {
        return bookRepository.findById(id).orElse(null);
    }

    public Book getOne(Long id) {
        return bookRepository.findById(id)
                .orElseThrow(() -> new BadRequestAlertException("entity-not-found", ("Entity with id: " + id + " not found!")));
    }

    public List<Book> getAll() {
        return bookRepository.findAll();
    }

    public Book save(Book book) {
        return bookRepository.save(book);
    }

}

我已经为数据库(BookRepository)和控制器层(使用 BookService 的 BookController)编写了集成测试。 我在任何地方都找不到服务层集成测试的示例。 如果我正确编写单元测试,是否有任何用例可以为其编写集成测试? 据我所知(这不是规则,而是常见用例):

  • 控制器 - 集成测试
  • 服务 - 单元测试
  • 存储库 - 集成测试

好的,这就是你可以想到的方法......

  1. repositories编写单元测试是零意义的,它们只被集成测试覆盖。 选择使用in-memory DB还是来自 Docker 容器的适当数据库取决于具体情况,但通常我会选择 Docker 容器中的数据库,因为 H2(即使使用postgres方言)不是完整的副本Postgres数据库。 因此,测试可能会运行,但应用程序将在生产中崩溃。

  2. 对于controllers ,您可能希望混合使用单元测试和集成测试。 使用MockMvc类测试大多数控制器内容。 集成测试涵盖了最关键的场景,以测试整个垂直(3 层)功能切片。

  3. 现在我们进入services部分。 如果你的服务有复杂的业务逻辑,你想验证它,那么它必须被单元测试覆盖,这样你就可以在很少的时间内做大量的检查。 此外,通过集成测试覆盖一些最基本的场景是有意义的。 特别是在您的情况下,服务层内的业务逻辑非常简单,因此我只进行集成测试。 如果它变得更复杂,您还可以添加一些单元测试,在其中模拟存储库类,以获得极快的测试时间,并且能够在不减慢项目中每个人的CI管道的情况下进行大量检查。

一般来说,尽量遵循 测试金字塔模式,并使用 Spring Boot 生态系统提供的最好的测试库

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM