Spring MVC 集成测试 - 如何查找请求映射路径?
Spring MVC Integration test - how look up request Mapping path?
我们有一些控制器,这样说:
@Controller
@RequestMapping("/api")
public Controller UserController {
@RequestMapping("/users/{userId}")
public User getUser(@PathVariable String userId){
//bla
}
}
我们对此进行了集成测试,比如:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@SpringApplicationConfiguration(classes= MyApp.class)
@IntegrationTest("server:port:0")
public class UserControllerIT {
@Autowired
private WebApplicationContext context;
@Test
public void getUser(){
test().when()
.get("/api/users/{userId}", "123")
.then()
.statusCode(200);
}
}
我们如何避免在测试中对“/api/users/{userId}”进行硬编码?我们如何通过名称查找请求映射。上面的请求映射应该有一个默认名称 UC#getUser
我唯一看到的是像 MvcUriComponentsBuilder 这样的东西,它似乎要求在请求的上下文中使用它(因此它会在 .jsps 中用于生成控制器的 URL)。
处理此问题的最佳方法是什么?我是否必须在控制器上将映射公开为静态字符串?我宁愿至少避免这种情况。
类似于:
URI location = MvcUriComponentsBuilder.fromMethodCall(on(UserController.class).getUser("someUserId").build().toUri();
我最终按照@DavidA 的建议做了,只是使用了反射:
protected String mapping(Class controller, String name) {
String path = "";
RequestMapping classLevel = (RequestMapping) controller.getDeclaredAnnotation(RequestMapping.class);
if (classLevel != null && classLevel.value().length > 0) {
path += classLevel.value()[0];
}
for (Method method : controller.getMethods()) {
if (method.getName().equals(name)) {
RequestMapping methodLevel = method.getDeclaredAnnotation(RequestMapping.class);
if (methodLevel != null) {
path += methodLevel.value()[0];
return url(path);
}
}
}
return "";
}
我不知道我们会多久使用一次它,但这是我能找到的最好的。
测试中的用法class:
when().get(mapping(UserAccessController.class, "getProjectProfiles"), projectId)
.then().assertThat().body(....);
我们有一些控制器,这样说:
@Controller
@RequestMapping("/api")
public Controller UserController {
@RequestMapping("/users/{userId}")
public User getUser(@PathVariable String userId){
//bla
}
}
我们对此进行了集成测试,比如:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@SpringApplicationConfiguration(classes= MyApp.class)
@IntegrationTest("server:port:0")
public class UserControllerIT {
@Autowired
private WebApplicationContext context;
@Test
public void getUser(){
test().when()
.get("/api/users/{userId}", "123")
.then()
.statusCode(200);
}
}
我们如何避免在测试中对“/api/users/{userId}”进行硬编码?我们如何通过名称查找请求映射。上面的请求映射应该有一个默认名称 UC#getUser
我唯一看到的是像 MvcUriComponentsBuilder 这样的东西,它似乎要求在请求的上下文中使用它(因此它会在 .jsps 中用于生成控制器的 URL)。
处理此问题的最佳方法是什么?我是否必须在控制器上将映射公开为静态字符串?我宁愿至少避免这种情况。
类似于:
URI location = MvcUriComponentsBuilder.fromMethodCall(on(UserController.class).getUser("someUserId").build().toUri();
我最终按照@DavidA 的建议做了,只是使用了反射:
protected String mapping(Class controller, String name) {
String path = "";
RequestMapping classLevel = (RequestMapping) controller.getDeclaredAnnotation(RequestMapping.class);
if (classLevel != null && classLevel.value().length > 0) {
path += classLevel.value()[0];
}
for (Method method : controller.getMethods()) {
if (method.getName().equals(name)) {
RequestMapping methodLevel = method.getDeclaredAnnotation(RequestMapping.class);
if (methodLevel != null) {
path += methodLevel.value()[0];
return url(path);
}
}
}
return "";
}
我不知道我们会多久使用一次它,但这是我能找到的最好的。
测试中的用法class:
when().get(mapping(UserAccessController.class, "getProjectProfiles"), projectId)
.then().assertThat().body(....);