java - 六边形中的入站端口如何提高可测试性

标签 java spring-boot onion-architecture hexagonal-architecture

在端口和适配器(六角形)架构中,您拥有:

DrivingAdapter -> InboundPort <- [ domain ] -> OutboundPort <- DrivenAdapter

注意:当然,端口是域的一部分

具体的例子可以是:

WebController -> OrderServicePort [ order domain ] -> OrderRepositoryPort <- MongoDbOrderRepositoryAdapter

因此,端口和适配器架构背后的想法是,您将域与应用程序边缘的具体适配器分开测试。

我不明白的是,在左侧公开接口(interface)端口对于可测试性有何帮助?

WebController 没有重要的逻辑,因此本身不是测试目标,而是作为端到端测试的一部分进行测试。所以我不会 mock OrderServicePort,因为它通常是我的测试主题。

当然,InboundPorts 的值(value)在于它们仅公开实现它的具体域类的简化 View 。

但我看不出使用 InboundPorts 提高的可测试性来自何处。

同意吗?

最佳答案

TL;DR;

是的,我同意。


我将端口视为一个抽象概念,与语言结构无关。我的意思是端口并不意味着接口(interface),甚至可能不需要接口(interface)。在某些语言中甚至没有接口(interface),因此需要使用其他语言结构来完成端口。

我还认为主要/驱动(入站)端口和辅助/驱动(出站)端口是具有不同具体目标的工件,尽管它们具有作为应用程序核心的入口/导出点的相同想法。

在我看来,辅助端口是核心所需工具的“原型(prototype)”,就像它需要的那样。在许多情况下,这个“原型(prototype)”只是一个接口(interface),但始终将其视为接口(interface)是有限制的。辅助适配器将是该端口的具体实现,围绕一个库。这是强大的,因为它可以轻松地交换所使用的库,无论是为了测试还是为了方便。

但是,主端口是应用程序的入口点,它启动一个用例,告诉应用程序要做什么以及如何做。它是一个具体的东西,而不是原型(prototype)。它是应用程序的核心。因此,如果我们更换它,我们就是在更换应用程序核心本身。主端口不像辅助端口那样是原型(prototype),因此,它本身不需要接口(interface)之类的东西。

更换它的唯一原因是测试主适配器本身,只是为了确保它们指向正确的用例。在这种情况下,我们需要诸如接口(interface)之类的东西。但在这种情况下,我们无论如何都需要启动应用程序,这通常是最昂贵的部分或测试,因此我们不妨将其作为 e2e、功能或集成测试,其中我们还测试核心或部分它。

在某些语言、应用程序或上下文中,在某些边缘情况下,也许需要这样做,也许这是最好的方法。我们不应该说“从不做...”或“总是做...”这样教条的话语,这始终取决于上下文。

但是,一般来说,我同意你的观点:主端口上的接口(interface)对于测试来说并没有多大优势,而且我会更进一步说主端口不需要接口(interface)。

关于java - 六边形中的入站端口如何提高可测试性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61483110/

相关文章:

Java 硬件加速不适用于英特尔集成显卡

java - 获取 http ://myserverip:8081/myapp/api/v1/campaigns 500 (Internal Server Error)

java - Spring Boot 连接到 mysql docker

html - 如何 : Active State During Server Action w/o JavaScript

java - 如何使用 GWT 在服务器上保存/打开文件

java.lang.ClassCastException : oracle. jdbc.driver.T4CConnection 无法转换为 com.arjuna.ats.internal.arjuna.recovery.Connection

java - 如何从项目中查找未使用的 Java 类和 JSP 文件

java - Spring Boot AMQP @RabbitListener 没有收到消息

architecture - DDD应用服务领域模型查看模型映射

ios - Bob 叔叔的清洁架构上的建模用例