我有自定义接口“平台”与@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?
1条答案
按热度按时间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
的更容易的替代方案。