java 如何将Spring Bean注入JUnit Jupiter ExecutionCondition

ozxc1zmp  于 2023-11-15  发布在  Java
关注(0)|答案(1)|浏览(107)

我有自定义接口“平台”与@ExtendWith注解和类实现ExecutionCondition。

@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
@ExtendWith(PlatformExecutionCondition.class)
public @interface Platform {

    MobilePlatform[] value();

@Component
@RequiredArgsConstructor
public class PlatformExecutionCondition implements ExecutionCondition {

    private final EmulatorConfigProperties emulatorConfigProperties;

    private final PlatformAnnotationManager platformAnnotationManager;

    @Override
    public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext   extensionContext) {
        MobilePlatform platform =       MobilePlatform.getByName(emulatorConfigProperties.getPlatformName());
        if (platform == null) {
            return disabled("Mobile platform is not specified");
        }
        if (extensionContext.getTestMethod().isEmpty()) {
            return enabled("Test class execution enabled");
        }

        Set<MobilePlatform> mobilePlatforms = platformAnnotationManager.getTestMobilePlatforms(extensionContext);
        if (mobilePlatforms.contains(platform)) {
            return enabled(format("{0} mobile platform is available for testing", platform.getName()));
        } else {
            return disabled(format("{0} mobile platform is not available for testing",   platform.getName()));
        }
    }
 }

字符串
在运行测试时,我捕获了一个错误java.lang.NoSuchMethodException:com.mob.market3b.platform.execution.PlatformExecutionCondition.()如果我删除了annotation,测试运行时没有错误,但是evaluateExecutionCondition方法没有使用。我如何在Spring中使用@ExtendWith annotation?

rhfm7lfc

rhfm7lfc1#

正如@slaw提到的,PlatformExecutionCondition必须有一个默认的无参数构造函数。
因此,PlatformExecutionCondition中的字段不能是final
尽管您可以在ApplicationContext中创建PlatformExecutionCondition的示例作为bean,并将其注入到测试类中的字段中,并使用@Autowired@RegisterExtension进行注解,(见https://stackoverflow.com/a/50251190/388980),从自定义JUnit Jupiter扩展中的ApplicationContext访问bean的最简单方法是从ApplicationContext手动检索它们--例如通过getBean(<bean type>)
您可以通过org.springframework.test.context.junit.jupiter.SpringExtension.getApplicationContext(ExtensionContext)访问PlatformExecutionCondition中的应用程序上下文。
标签:https://stackoverflow.com/a/56922657/388980

请注意,通常不建议在ExecutionCondition实现中访问ApplicationContext(或应用程序上下文中的bean),因为您的ExecutionCondition可能会有效地强制创建一个原本不会使用的ApplicationContext(如果ExecutionCondition最终禁用测试)。有关详细信息,请参阅@DisabledIf(loadContext)的文档。

旁注

Spring的@EnabledIf@DisabledIf注解可能是实现您自己的ExecutionCondition的更容易的替代方案。

相关问题