gpt4 book ai didi

java - 没有本地数据库的 TDD?

转载 作者:太空宇宙 更新时间:2023-11-04 11:26:19 24 4
gpt4 key购买 nike

当我们开发 Rails 应用程序时,我们会在开发环境中使用本地数据库,并确保我们的规范作为 TDD 的一部分通过。

用Java做TDD时,不使用类似Sqlite的本地数据库是常态吗?我被告知内存数据库(HSQL)是运行单元和集成测试所需的全部。这是遵循的标准做法吗?

我们在 Rails 应用程序中使用 Sqlite 进行本地开发和运行 Rspec。但我的问题是关于Java开发的。我们正在努力用 Java 重写我们的应用程序的一部分。有人告诉我,如果您编写涵盖所有功能的集成测试,则不需要任何数据库进行开发。并且被告知 HSQL 足以满足这一要求。由于我习惯在 Rails 中使用数据库进行本地开发,我想知道您以后如何调试任何问题?如果我们能够在本地环境中复制数据和场景,对于分析任何问题都是非常有帮助的。如果您不使用任何数据库作为开发环境,完全依赖 HSQL 进行测试,那么在 Java/Spring 中如何做同样的事情呢?

最佳答案

对我来说,我从不使用任何数据库(包括HSQLDB)来编写单元测试。

我更喜欢创建一些接口(interface),例如:*Repository。让 SUT 与它进行通信。然后我编写一些实现类让他们实现我创建的接口(interface)。类层次结构如下所示:

          <<uses>>
SUT ---------------> Repository
^
| <<implement>>
|
|--------|--------|-------|
| | | |
JPA Hibernate JDBC .etc

这种方法被称为 Separation of Concerns 。应用程序领域是一个问题,数据访问是另一个问题。遵循这种方法会产生许多插件兼容组件和独立模块,例如:domainjpajdbc和.etc,但重要事情是这将使您的测试更加可测试

然后我使用Test Double在单元测试中模拟/ stub 其协作以测试它们是否按预期一起工作。伪代码如下:

repo = mock(Repository.class);
SUT it = new SUT(repository);

when(repo.find(id)).thenReturn(entity);

assert it.exercise() == expectedResult;
assert it.currentState == expectedState;

但是您必须使用数据库编写一些集成测试来测试在第三方 API 上运行的每个Repository实现。马丁称之为:Test Isolation .

关于java - 没有本地数据库的 TDD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44320344/

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