java - 将放心的@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>
如果您需要更多信息,请告诉我。谢谢
解决方案
使用 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>
推荐阅读
- javascript - 模块解析失败:意外字符
- laravel-nova - 迁移到 Linux 服务器后访问 Nova 的 301 重定向循环
- r - 如何在 R 数据帧中实现函数调用
- c++ - 在 vector::at 返回参考后进行更改
- cordova - 使用 jquery-mobile-iscrollview 在 Android 中将下拉刷新操作与 Cordova InAppbrowser 绑定时遇到问题?
- python - 在 Django 中自动导入自定义文件
- python - 有没有更 Pythonic/compact 的方式来创建这个字典?
- android - 如何从 TextInputLayout 中删除水平填充?
- c++ - Cmake:如何引用链接到多个程序的目标文件中的文件?
- asp.net-core - 使用 EF Core 更改非原始字段(导航)的列名