【问题标题】:Spring, is there a way to get around not being able to extend 2 classes in Java?Spring,有没有办法解决无法在 Java 中扩展 2 个类的问题?
【发布时间】:2021-03-22 22:56:53
【问题描述】:

我有一个带有以下签名的集成测试:

@SpringBootTest(classes = Example.class)
@ActiveProfiles("test")
public class CoolTest_IntegrationTest extends MyTestFrameworkAbstractClass {

PrismIntegrationFramework 是一个抽象类,其中包含一系列设置方法,可让我团队中的人员更轻松地进行测试。

现在,在 Spring 中,我严重依赖 DynamicPropertySource 来注入来自我的测试容器的动态 IP 地址等。

理想情况下,我想要一个单独的“测试工具”,我可以根据测试类型注入/调用。 IE - 我将有一个 GraphDBHarness,当我编写图形数据库集成测试时会调用它。

@SpringBootTest(classes = GraphClient.class)
@ActiveProfiles("test")
public class CoolTest_IntegrationTest extends MyTestFrameworkAbstractClass extends GraphDBHarness {

我知道上面的内容是无效的,但如果这是 valid 那么我内部会有类似的东西:

public abstract class GremlinTestHarness {

  @DynamicPropertySource
  static void executeDynamicPropertyInjection(DynamicPropertyRegistry registry) {
    registry.add(
        GREMLIN_SERVER_KEY, () -> SupportedContainers.gremlinServer.getContainerIpAddress());
    registry.add(GREMLIN_SERVER_PORT, () -> SupportedContainers.gremlinServer.getFirstMappedPort());
  }
}

所以理论上,如果我有 N 个这样的东西,那么我可以注入我需要的东西,或者随意提供我需要的东西。这在春天有可能吗?

【问题讨论】:

  • 既然您已经在使用 Gremlin,是否可以选择使用 Groovy(至少用于测试)?

标签: java spring spring-boot testing polymorphism


【解决方案1】:

简答:在 Java 中没有办法解决类的单一继承问题。这样做是为了避免Diamond Problem

长答案:您可以利用接口的多重继承。此外,几乎所有您认为需要继承的问题都可以通过组合来解决。一般来说,继承——尽管有时是必要的邪恶——违反了封装,并且比你想象的更成问题。在不了解您的具体实现细节的情况下,从表面上看,您的问题似乎适合组合优于继承的情况。作为第一步,我通常会做一个快速的“is-a”检查,看看继承是否有意义。在你的情况下:

CoolTest_IntegrationTest is-a MyTestFrameworkAbstractClass 没有通过我的逻辑测试,因为测试类不是框架。一个测试类使用一个框架。即使说一个框架有一个测试也可能没有多大意义。但是,这比从抽象框架继承的测试要好得多。 CoolTest_IntegrationTest is-a GraphDBHarness 也没有通过我的初始测试。测试还使用数据库工具,这意味着组合。

再次,您似乎出于所有错误的原因尝试使用继承。访问类中的字段/方法本身并不是继承的好理由。如果你有一个抽象框架类,你应该只扩展以制作更具体类型的框架,而不是创建测试类。

使用依赖注入将这些项目传递给您的测试类(即 DB 工具),而不是仅使用继承来访问其字段和方法。

也就是说,您可以使用单继承并创建一个继承链,其中 A 类扩展 B 并且它扩展 C(而不是 A 类扩展 B 和 C)。同样,在您的情况下,我认为这不是正确的方法。

【讨论】:

  • 感谢您的回复。理想情况下,构图是我想要的。我希望了解是否可以使用依赖注入方法链接到 DynamicPropertySource 注释。如果可能的话,有什么想法吗?
  • 示例是:我使用依赖注入(组合)在我的班级上有一个 TestHarness。它存在于我的课程中的想法允许自动调用 DyanmicPropertySource 注释
  • 我尝试使用@AutoWired,但不确定如何正确使用
  • 是的。我创建了自定义 JUnit 扩展来劫持 Spring 中的一些生命周期回调。我的问题更多地指向弹簧框架。我很欣赏您的回复,但最终还是在为这个用例寻找解决方案。
  • 我会编辑一些包名。感谢您的回复,内容丰富,我赞成。谢谢!
猜你喜欢
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 2021-06-03
  • 2020-01-18
相关资源
最近更新 更多