gpt4 book ai didi

java - 在 JUnit 中自动注册扩展

转载 作者:行者123 更新时间:2023-12-02 09:05:25 24 4
gpt4 key购买 nike

我正在扩展 JUnit 的 ParameterResolver 以在测试方法中提供自定义参数。

 public class MyParameterResolver implements ParameterResolver {

@Override
public boolean supportsParameter(ParameterContext parameterContext,
ExtensionContext extensionContext) throws ParameterResolutionException {
return parameterContext.getParameter().getType() == MyWrapper.class;
}

@Override
public Object resolveParameter(ParameterContext parameterContext,
ExtensionContext extensionContext) throws ParameterResolutionException {

// Do something about getting MyAnnotation

return new MyWrapper();
}

}

然后使用 ExtendWith 在测试方法中使用它

@ExtendWith(MyParameterResolver.class)
@Test
@MyAnnotation(val = 20)
@MyAnnotation(val = 30)
void test(MyWrapper wrapper) {
System.out.println(wrapper);
}

它工作得很好,但是我不喜欢这样的想法:所有需要此扩展的测试都需要用 @ExtendWith(MyParameterResolver.class) 进行注释,是否可以自动注册注释每当测试方法包含 MyWrapper 参数或 MyAnnotation 注释时,以编程方式在 Junit 中?

最佳答案

§5.2 of the JUnit 5 User Guide显示了注册扩展的三种方式:

  1. 使用 @ExtendWith 进行声明 ( §5.2.1 )。

    Developers can register one or more extensions declaratively by annotating a test interface, test class, test method, or custom composed annotation with @ExtendWith(…​) and supplying class references for the extensions to register.

    注意:如果您使用 @ExtendWith(...) 注释该类,则所有包含的测试方法都将通过指定的扩展名进行扩展.

  2. 以编程方式使用 @RegisterExtension ( §5.2.2 )。

    Developers can register extensions programmatically by annotating fields in test classes with @RegisterExtension.

    When an extension is registered declaratively via @ExtendWith, it can typically only be configured via annotations. In contrast, when an extension is registered via @RegisterExtension, it can be configured programmatically — for example, in order to pass arguments to the extension’s constructor, a static factory method, or a builder API.

  3. 自动通过 java.util.ServiceLoader ( §5.2.3 )。

    In addition to declarative extension registration and programmatic extension registration support using annotations, JUnit Jupiter also supports global extension registration via Java’s java.util.ServiceLoader mechanism, allowing third-party extensions to be auto-detected and automatically registered based on what is available in the classpath.

    Specifically, a custom extension can be registered by supplying its fully qualified class name in a file named org.junit.jupiter.api.extension.Extension within the /META-INF/services folder in its enclosing JAR file.

    注意: 自动注册 must be explicitly enabled .

如果您同意在全局范围内注册您的扩展程序,那么您可以使用自动注册机制。但似乎没有一种方法可以仅在测试方法具有特定参数类型时扩展它们。但是,您也许可以创建所谓的组合注释来使事情变得更简单:

@ExtendWith(MyParameterResolver.class)
@Retention(RUNTIME)
@Target(METHOD)
public @interface ComposedAnnotation {

int[] vals(); // int array to (maybe?) replace the multiple @MyAnnotation(val = XXX) annotations
}

虽然我不知道这是否与您的 @MyAnnotation 注释兼容。

请注意,如果您的 #supportsParameter(ParameterContext,ExtensionContext) 实现速度很快,那么为不使用它的方法注册扩展应该不是问题。换句话说,它不会显着减慢您的测试速度,或者据我所知,不会导致错误。

关于java - 在 JUnit 中自动注册扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59851000/

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