Spring集成Cucumber添加@Component仍报No qualifying bean异常
Cucumber测试运行时Spring自动注入LoginPage Bean失败问题
错误信息
无法调用定义在
pcz.StepDefs.LoginPageStepDefs.userClicksRegisterOnMainPage()的步骤[User clicks Register on main page],步骤定义存在问题,转换后的参数类型为()根因:io.cucumber.core.backend.CucumberBackendException: 创建名为'pcz.StepDefs.LoginPageStepDefs'的Bean时出错:字段'loginPage'表达的依赖不满足;嵌套异常为org.springframework.beans.factory.NoSuchBeanDefinitionException: 找不到类型为'pcz.Page.LoginPage'的符合条件的Bean:预期至少存在1个可作为自动注入候选的Bean,依赖注解为:{@org.springframework.beans.factory.annotation.Autowired(required=true)}
项目结构

现有代码
步骤定义类
public class LoginPageStepDefs { @Autowired LoginPage loginPage; @When("User clicks Register on main page") public void userClicksRegisterOnMainPage() { loginPage.test(); } }
页面对象类
import org.springframework.stereotype.Component; @Component public class LoginPage { public void test(){ } }
Spring配置类
@CucumberContextConfiguration @ContextConfiguration(classes = SpringBootCucumberApplication.class, loader = AnnotationConfigContextLoader.class) @SpringBootTest() public class CucumberSpringConfiguration { }
SpringBoot启动类
@SpringBootApplication() public class SpringBootCucumberApplication { public static void main(String[] args) { } }
问题原因
核心原因有两点:
@SpringBootApplication默认的组件扫描范围是启动类所在的包及其子包,当前SpringBootCucumberApplication未配置扫描路径,LoginPage所在的pcz.Page包不在默认扫描范围内,Spring启动时不会扫描到该类,无法将其注册到IOC容器。LoginPageStepDefs类本身未添加Spring托管注解,该类不会被Spring上下文识别,内部标记@Autowired的字段无法完成注入。
修复方案
- 调整SpringBoot启动类的组件扫描范围,明确指定扫描根包覆盖所有业务类所在路径,补全启动类main方法逻辑:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication(scanBasePackages = "pcz") public class SpringBootCucumberApplication { public static void main(String[] args) { SpringApplication.run(SpringBootCucumberApplication.class, args); } } - 为
LoginPageStepDefs类添加@Component注解,标记为Spring托管Bean,保证内部注入逻辑生效:import org.springframework.beans.factory.annotation.Autowired; import io.cucumber.java.en.When; import org.springframework.stereotype.Component; @Component public class LoginPageStepDefs { @Autowired LoginPage loginPage; @When("User clicks Register on main page") public void userClicksRegisterOnMainPage() { loginPage.test(); } } - 移除
CucumberSpringConfiguration上冗余的@ContextConfiguration配置,@SpringBootTest会自动识别SpringBoot启动类,简化配置:import io.cucumber.spring.CucumberContextConfiguration; import org.springframework.boot.test.context.SpringBootTest; @CucumberContextConfiguration @SpringBootTest public class CucumberSpringConfiguration { }
内容的提问来源于stack exchange,提问作者user18542516
相关产品推荐
相关产品推荐

