Spring,有没有办法避免无法在Java中扩展2个类?

Spring,有没有办法避免无法在Java中扩展2个类?,java,spring,spring-boot,testing,polymorphism,Java,Spring,Spring Boot,Testing,Polymorphism,我有一个具有以下签名的集成测试: @SpringBootTest(classes = Example.class) @ActiveProfiles("test") public class CoolTest_IntegrationTest extends MyTestFrameworkAbstractClass { PrismIntegrationFramework是一个抽象类,包含一系列设置方法,使我的团队成员更容易进行测试 现在,在春季,我严重依赖DynamicProp

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

@SpringBootTest(classes = Example.class)
@ActiveProfiles("test")
public class CoolTest_IntegrationTest extends MyTestFrameworkAbstractClass {
PrismIntegrationFramework
是一个抽象类,包含一系列设置方法,使我的团队成员更容易进行测试

现在,在春季,我严重依赖
DynamicPropertySource
注入来自测试容器的动态Ip地址等

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

@SpringBootTest(classes = GraphClient.class)
@ActiveProfiles("test")
public class CoolTest_IntegrationTest extends MyTestFrameworkAbstractClass extends GraphDBHarness {
我知道上述内容是无效的,但如果这是有效的,那么我内部会有如下内容:

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个,那么我可以注入我需要的东西,或者随意提供我需要的东西。这在春天可能吗?

简短的回答:在Java中,类的单一继承是无法避免的。这样做是为了避免错误

详细答案:您可以利用接口的多重继承。而且,几乎所有您认为需要继承的问题,您都可以通过组合来解决。一般来说,继承虽然有时是一种必要的罪恶,但它违反了封装,并且可能比您认为的问题更大。表面上看,在不太了解具体实现细节的情况下,您的问题似乎适合组合而不是继承的情况。我通常做一个快速的“is-a”检查作为第一步,看看继承是否有意义。就你而言:

CoolTest\u IntegrationTest
is-a
mytestframeworkastractclass
未通过我的逻辑测试,因为测试类不是框架。测试类使用框架。即使说一个框架有一个测试也没有多大意义。然而,这比从抽象框架继承的测试要好得多。
CoolTest\u IntegrationTest
is-a
GraphDBHarness
也没有通过我的初始测试。测试还使用DB线束,这意味着合成

同样,在对实现了解不多的情况下,您似乎出于错误的原因试图使用继承。访问类中的字段/方法本身并不是继承的好理由。如果您有一个抽象的框架类,那么您应该只扩展以生成更具体的框架类型,而不是创建测试类

这个答案可以继续下去,但我认为它已经足够长了。使用依赖项注入将这些项传递给测试类(即DB线束),而不是仅使用继承来访问其字段和方法


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

既然您已经在使用Gremlin,那么使用Groovy(至少用于测试)是一种选择吗?谢谢您的回答。理想的构图是我想要的。我希望了解是否可以使用依赖项注入方法链接到DynamicPropertySource注释。如果可能的话,有什么想法吗?例如:我使用依赖项注入(组合)在我的类上有一个TestHarness。我的类中存在的这种想法允许自动调用DyanmicPropertySource注释。我尝试使用@AutoWired,但不确定如何正确地执行。是的。我在Spring中创建了自定义JUnit扩展来劫持一些生命周期回调。我的问题更多地指向spring框架。我很感谢您的回复,但我最终还是在寻找这个用例的解决方案。一旦我修改了一些软件包名称,我就会这么做。我很感激你的回答,内容丰富,我投了更高的票。谢谢