Java 在Cucumber步骤中自动关联字段会产生NullPointerException

Java 在Cucumber步骤中自动关联字段会产生NullPointerException,java,spring-boot,junit,cucumber-jvm,Java,Spring Boot,Junit,Cucumber Jvm,Cumber runner配置: @RunWith(Cucumber.class) @CucumberOptions(features = "/features",glue {""}) @ContextConfiguration(classes = Init.class, initializers = ConfigFileApplicationContextInitializer.class) public class Test { } 功能文件: class feature

Cumber runner配置:

@RunWith(Cucumber.class)
@CucumberOptions(features = "/features",glue {""})
@ContextConfiguration(classes = Init.class,
        initializers = ConfigFileApplicationContextInitializer.class)
public class Test {
}
功能文件:

class feature {
  Scenario: Save test in db.
    When I inject a payload in the aws queue
    Then it should be integrated in database
}
步骤定义文件::

@CucumberAbstract
@ContextConfiguration("classpath:application.yml")
public class MyStepdefs {

    @Autowired
    private QueueMessagingTemplate queueMessagingTemplate;

    @Autowired
    TestRepository testRepository;

    String message = "Hi";

    public MyStepdefs() {
        When("^I inject a payload in the aws queue$", () -> {
            this.queueMessagingTemplate.convertAndSend("QUEUE_NAME", message);
        });
    }

    @Then("^it should be integrated in database$")
    public void itShouldBeIntegratedInDatabase() throws Throwable {
        //validations
    }
}
我尝试在这里创建一个自定义注释,并在stepDefinition文件的顶部使用该注释。 抽象测试:::

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ContextConfiguration(classes = Init.class, loader = 
                      SpringApplicationContextLoader.class)
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public @interface CucumberAbstract {
}
Cucumber runner(
Cucumber.api.junit.cucucumber
)不加载任何Spring上下文。
因此,您的cucumber step类不支持Spring。
要将bean注入到类的字段中,必须加载Spring上下文,在您的例子中是Spring引导上下文

因此,指定
@SpringBootTest
是您需要的:

@SpringBootTest
public class MyStepdefs {
  ...
}

实际上,您需要的是将Cucumber与Spring Boot集成。 因此,您需要为maven项目添加这些依赖项:

    <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>4.7.4</version>
        </dependency>

        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-junit</artifactId>
            <version>4.7.4</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-spring</artifactId>
            <version>4.7.4</version>
        </dependency>
现在在StepDefinition类中,您需要配置ContextConfiguration以便能够使用Spring

@SpringBootTest
@ContextConfiguration(
        classes = Application.class,
        loader = SpringBootContextLoader.class)
public class StepsDefinitions {

    @Autowired
    private ApplicationContext appContext;
}
现在在StepDefinition类中,您可以使用“Autowired”注释来注入bean

这解决了我的问题,您也可以查看本教程:

谢谢您的回复。我尝试添加@SpringBootTest,但仍然不起作用。另外,我定义了所有属性的application.yml文件也没有加载。我还缺少什么吗?你看到Spring容器启动了吗?没有。它没有启动调试程序在测试运行后直接进入步骤定义文件,并且日志只显示“连接到目标VM,地址:'*******',传输:'套接字'”。没有日志说明spring容器已启动。我得到的唯一错误是空指针异常,因为自动连线批注不工作。你能帮帮我吗
@SpringBootTest
@ContextConfiguration(
        classes = Application.class,
        loader = SpringBootContextLoader.class)
public class StepsDefinitions {

    @Autowired
    private ApplicationContext appContext;
}