java - Spring Boot 服务层 : 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) 和 Controller 层(使用 BookService 的 BookController)编写了集成测试。我在任何地方都找不到服务层集成测试的例子。如果我正确地编写了单元测试,是否有为它编写集成测试的用例?据我所知(这不是规则,而是常见用例):

  • Controller - 集成测试
  • 服务 - 单元测试
  • 存储库 - 集成测试

最佳答案

好吧,这就是你的想法......

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

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

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

一般来说,尝试始终遵循 test pyramid 模式并使用 Spring Boot 生态系统提供的最佳可能的 testing libraries。

关于java - Spring Boot 服务层 : Unit or Integration tests?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69873915/

相关文章:

c++ - 如何直接从输入流中向集合中插入值?

reactjs - Next.js 应用程序是 SPA 还是单页应用程序?

javascript - discord.js 禁用 “interaction failed”

python - 仅当 Pandas 中的所有值均为 0 时,才将 0 替换为选定列的 NaN

javascript - 遍历对象数组并获得新的对象数组

python - 如何在 python 中删除表的某些行?

python - 将多列的不同值组合成 Polars 中的一列

.net-core - SSE 和 AVX 的 MoveMask 的目的是什么

regex - 如何验证用户输入中的 Perl 正则表达式?

sql - 在 exec 中声明变量会改进 SQL 查询计划吗?