当前位置: 首页 > 知识库问答 >
问题:

是否有可能使JUnit5扩展实现由扩展类实现的接口?

尉迟阳煦
2023-03-14
@ExtendWith(MyExtension.class)
public class MyTestClass {

  @Test myTest1() {}

  @Test myTest2() {}

  // ...
}
public interface SomeInterface {
  SomeClient getSomeClient();
  SomeClient getSomeClientAsAdministrator();
}

@ExtendWith(MyExtension.class)
public class MyTestClass implements SomeInterface {

  @Test myTest1() {}

  @Test myTest2() {}

  // ...

  SomeClient getSomeClient() {
    // ...
  }

  SomeClient getSomeClientAsAdministrator() {
    // ...
  }
}

但是现在,我希望这些接口实现也可用于扩展,例如。

public class MyExtension implements BeforeEachCallback, SomeInterface
{

  @Override
  public void beforeAll(ExtensionContext extensionContext) {
    // be able to use getSomeClient();
  }
}

我如何设置我的课程来实现这一点?(或者,反对这样做的固有缺陷或代码气味是什么?)

共有1个答案

别开诚
2023-03-14

实现这一目标的一种方法是在上下文对象上使用getTestInstance():

public class MyExtension implements BeforeEachCallback {
    @Override
    public void beforeEach(ExtensionContext context) throws Exception {

        context.getTestInstance().ifPresent(instance -> {
            if (instance instanceof SomeInterface) {
                SomeInterface some = (SomeInterface) instance;
                System.out.println(some.getSomeClient());
            }
        });
    }
}

你在这里可以看到两件事:

  1. 可能没有测试实例对象,例如在beforeallcallback中,因为测试实例通常是每个测试创建的。
  2. 需要强制转换。这意味着您应该检查您的测试实例是否真的实现了SomeInterface
 类似资料:
  • SPI 扩展接口仅用于系统集成,或 Contributor 扩展功能插件。

  • 问题内容: 为了减少类的依赖性,我想将参数(使用泛型类)发送到扩展某些类并实现接口的构造函数,例如 可能吗? 此外,使用T类,我想使用T.getActivity()作为Context创建视图。 问题答案: T必须扩展Fragment并实现SomeInterface 在这种情况下,您可以声明以下内容: 这将需要扩展和实现类型的对象。 此外,使用T类,我想使用T.getActivity()作为Cont

  • 本文向大家介绍Django DRF路由与扩展功能的实现,包括了Django DRF路由与扩展功能的实现的使用技巧和注意事项,需要的朋友参考一下 一. 视图集与路由的使用 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() 保存数据 destory() 删除数据 ViewSe

  • 我希望有一个方法返回一个类 ,该类根据作业类型具有不同的方法。 例如,作业类型可以是 或 。它们不共享方法,但需要从单个方法getJob()中获取它们。 现在我有一个普通的类< code>job,它的方法返回< code>null,没有构造函数,因为我在< code>getJob()方法中构造了其他类(例如BackupJob或RunCommandJob)。 在返回单个类的同时获得不同工作类的最佳方

  • 问题内容: 我有以下类和接口: 我想创建一个方法,其中参数需要为BasicObject类型并实现CodeObject。我尝试了以下代码,但不能保证clazz是实现CodeObject的类。 我想做这样的事情,但不能编译: 问题答案: 您的模式类必须扩展和扩展/实现(实际上是一个接口)。您可以使用方法签名的通配符定义中声明的多个类来执行此操作,如下所示: 请注意,如果您通过以下任何一种方式进行操作,

  • 我有以下类和接口: 我想创建一个方法,其中参数需要是BasicObject类型,并实现CodeObject。我尝试了以下代码,但它不能保证clazz是一个实现CodeObject的类。 我想做这样的事情,但它无法编译: