Пустой указатель Исключение при введении уверенного @Steps в тест весенней загрузки - PullRequest
0 голосов
/ 05 апреля 2020

Я новичок в Springboot и пытаюсь интегрировать интеграционные тесты, используя Rest-Assured для тестирования моего Rest-Api.

Получаю NPE при внедрении @Steps в SpringBoot Test. Я представляю класс шагов для улучшить код повторного использования. Этот тест работает хорошо, если метод шага относится к 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 имеет значение null.
Вот моя зависимость, которую я использовал

    <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>

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация по этому вопросу. Спасибо

1 Ответ

0 голосов
/ 06 апреля 2020

Решение с использованием 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;}
}

В Тестовый класс, зависимость 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. Я думаю, что проблема в том, как генерируются результаты теста. Шаги не читаются Серенити. Spring будет внедрять @Autowired классы, а @serenity вводит @steps классы. Я предполагаю, что это происходит потому, что спокойствие и весна создают компоненты в разных контекстах.

необходимые зависимости в вашей пом. 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> 

enter image description here

...