![](/img/trans.png)
[英]Spring Boot MockMVC returning empty body with statuscode 200 when unit testing
[英]Spring Boot: MockMvc returning empty body for POST request
我正在使用 Spring Boot 和 Spring Data Rest 编写一个小型演示应用程序。 我有以下模型和相应的存储库:
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
private String jobTitle;
public Employee() {
}
... // getters and setters
}
@RepositoryRestResource(collectionResourceRel = "employees", path = "employees")
public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Long> {
@RestResource(path = "by-last-name", rel = "by-last-name")
Page<Employee> findByLastNameIgnoreCase(Pageable pageable, @Param("lastName") String lastName);
@RestResource(path = "by-job-title", rel = "by-job-title")
Page<Employee> findByJobTitleIgnoreCase(Pageable pageable, @Param("jobTitle") String jobTitle);
}
如果我通过邮递员提出以下请求:
POST localhost:8080/employees
{"firstName":"Test","lastName":"McTest","jobTitle":"Tester"}
我收到一个包含我新创建的实体的完整响应正文:
{
"firstName": "Test",
"lastName": "McTest",
"jobTitle": "Tester",
"_links": {
"self": {
"href": "http://localhost:8080/employees/120"
},
"employee": {
"href": "http://localhost:8080/employees/120"
}
}
}
但是,当我通过如下所示的测试发出相同的请求时,我得到一个空的响应正文:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Application.class)
@AutoConfigureMockMvc
public class EmployeeIntegrationTest {
@Autowired
private MockMvc mvc;
@Autowired
ObjectMapper objectMapper;
@Test
public void testAddEmployee() throws Exception {
Employee employee = new Employee();
employee.setFirstName("Test");
employee.setLastName("McTest");
employee.setJobTitle("Tester");
MockHttpServletRequestBuilder requestBuilder = post("/employees")
.contentType(APPLICATION_JSON)
.content(objectMapper.writeValueAsString(employee));
mvc
.perform(requestBuilder)
.andExpect(status().isCreated())
.andExpect(jsonPath("$.firstName", Matchers.is("Test"))); // Fails, because content is empty.
}
}
对于它的价值,如果我然后在我的测试中执行GET /employees
,我实际上会在响应正文中看到该实体,所以我知道它正在被创建。
我的期望是我会通过任何一种方法得到相同的响应,唉,目前情况并非如此,而且似乎使用MockMvc
POST
请求没有返回正文。 我是否可能在某处丢失了配置设置?
我能够通过明确设置来解决这个问题
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
config.setReturnBodyForPutAndPost(true);
}
在实现RepositoryRestConfigurer
的@Configuration
类中
我的猜测是这是为主代码隐式设置的,而不是为测试设置的。
在请求中设置 HTTP Accept 标头应该会导致返回响应正文:
MockHttpServletRequestBuilder requestBuilder = post("/employees")
.accept(APPLICATION_JSON)
.contentType(APPLICATION_JSON)
.content(objectMapper.writeValueAsString(employee));
默认情况下,如果指定了 HTTP Accept 标头( 问题 #418 ),Spring Data REST 只会返回响应正文。 这似乎没有在 Spring Data REST 文档中明确说明,尽管该文档在引用公开资源的默认状态代码时确实暗示了这种行为:
如果配置值(
RepositoryRestConfiguration.returnBodyOnUpdate
和RepositoryRestConfiguration.returnBodyCreate
)显式设置为null
,则使用 HTTP Accept 标头来确定响应代码。
我的猜测是您的 Postman 请求正在设置“Accept”标头,这就是您在 Postman 中没有看到这种行为的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.