首页 > 解决方案 > 将放心的@Steps注入spring-boot测试时出现空指针异常

问题描述

我是 springboot 的新手,正在尝试使用 Rest-assured 集成集成测试来测试我的 Rest-Api。

在将@Steps 注入 SpringBoot 测试时,我得到了 NPE。我正在引入一个 step 类来改进可重用性代码。如果 step 方法在 IT 类中,这个测试运行良好。我尝试了 @Component 注释,但它没有不工作

步类

import net.thucydides.core.annotations.Step;
import org.apache.http.HttpStatus;

import static com.jayway.restassured.RestAssured.when;

public class StaffSteps {
    protected  static String BASE_STAFF_URL = "/api/v1a/staff/";
    protected  static Staff staff;

    @Step
    public StaffSteps getStaffMemberById(String id){
        staff = when().get(BASE_STAFF_URL+id)
                .then().assertThat()
                .statusCode(HttpStatus.SC_OK)
                .extract()
                .as(Staff.class);
    return this;
    }
    @Step
    public Staff getStaff(){return staff;}
}

import net.thucydides.core.annotations.Steps;
import org.apache.http.HttpStatus;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.Arrays;
import java.util.List;

import static com.jayway.restassured.RestAssured.when;

@RunWith(SpringJUnit4ClassRunner.class)
public class StaffControllerIT extends BaseTest {

    @Steps
    private StaffSteps staffSteps;

    @Before
    public void setUp(){
    }

    @Test
    public void getStaffMemberById(){
        String id ="ff8081817049a34e017049a379320000";
        Staff staff = staffSteps.getStaffMemberById(id).getStaff();

        System.err.println(staff);
    }

当我运行这个测试时,staffSteps 为空。
这是我使用的依赖项

    <dependency>
            <groupId>net.serenity-bdd</groupId>
            <artifactId>serenity-core</artifactId>
            <version>1.9.4</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.rest-assured</groupId>
            <artifactId>rest-assured</artifactId>
            <version>3.0.0</version>
            <scope>test</scope>
        </dependency>

如果您需要更多信息,请告诉我。谢谢

标签: javaspring-bootrest-assuredserenity-bdd

解决方案


使用 SpringRunner 的解决方案:

@Bean使用和注释步骤,@StepScope因此,该对象将与 StepExecution 共享其生命周期。

public class StaffStepsConfig {
    protected  static String BASE_STAFF_URL = "/api/v1a/staff/";
    protected  static Staff staff;

    @Bean
    @StepScope
    public StaffSteps getStaffMemberById(String id){
        staff = when().get(BASE_STAFF_URL+id)
                .then().assertThat()
                .statusCode(HttpStatus.SC_OK)
                .extract()
                .as(Staff.class);
    return this;
    }

    @Bean
    @StepScope
    public Staff getStaff(){return staff;}
}

在 Test 类中,spring-batch-test 依赖项提供了一组有用的帮助方法和侦听器,可用于在测试期间配置 Spring Batch 上下文。

@RunWith(SpringRunner.class)
//@SpringBatchTest
//@SpringBootTest
@EnableAutoConfiguration
@ContextConfiguration(classes = { StaffStepsConfig.class })
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
public class StaffControllerIT extends BaseTest {
    @Autowired
    private StaffSteps staffSteps;

    @Before
    public void setUp(){
    }

    @Test
    public void getStaffMemberById(){
        String id ="ff8081817049a34e017049a379320000";
        Staff staff = staffSteps.getStaffMemberById(id).getStaff();

        System.err.println(staff);
    }
}

注意:此跑步者识别@SpringBootTest. 我认为问题在于生成测试结果的方式。Serenity 没有读取这些步骤。Spring 将注入@Autowired类,@serenity并将注入@steps类。我认为这是因为 serenity 和 spring 在不同的上下文中创建组件。

pom.xml 中所需的依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-batch</artifactId>
    <version>2.1.9.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <version>2.1.9.RELEASE</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework.batch</groupId>
    <artifactId>spring-batch-test</artifactId>
    <version>4.2.0.RELEASE</version>
    <scope>test</scope>
</dependency> 

在此处输入图像描述


推荐阅读