【发布时间】:2020-01-18 23:02:12
【问题描述】:
我已经放了一个非常简单的sample project on GitHub 来重现问题。
主要问题是我有一个 PersonController 有一个 PutMapping 来创建一个新人。为了使用 URL 填充 Location 标头以获取该人,我添加了 UriComponentsBuilder 作为该 PutMapping 的参数,您可以在此处看到:
@PostMapping
public ResponseEntity<Person> add(@RequestBody final PersonForCreate personForCreate, UriComponentsBuilder uriComponentsBuilder) {
Person newPerson = new Person(this.people.size() + 1, personForCreate.getFirstName(), personForCreate.getLastName());
this.people.add(newPerson);
// create the URI for the "Location" header
MvcUriComponentsBuilder.MethodArgumentBuilder methodArgumentBuilder = MvcUriComponentsBuilder.fromMappingName(uriComponentsBuilder, "getById");
methodArgumentBuilder.arg(0, newPerson.getId());
URI uri = URI.create(methodArgumentBuilder.build());
return ResponseEntity.created(uri).body(newPerson);
}
这在运行项目时工作正常。但是在运行测试时,这会导致IllegalArgumentException No WebApplicationContext。错误来自MvcUriComponentsBuilder.fromMappingName 调用,但我不知道为什么。
我的测试如下:
@ExtendWith(SpringExtension.class)
@WebMvcTest
class PersonControllerTest {
@Autowired
private PersonController personController;
@Test
void add() {
this.personController.add(new PersonForCreate("Charles", "Darwin"), UriComponentsBuilder.newInstance());
}
}
我不确定传递UriComponentsBuilder.newInstance() 是否正确,但我尝试了其他值并发现没有区别。
仅供参考,示例项目使用 Spring Boot 2.2.3 和 JUnit 5,但我在 JUnit 4 上使用示例项目时遇到了同样的问题。
【问题讨论】:
标签: spring-boot spring-mvc spring-boot-test spring-mvc-test