Spring MVC集成测试 - 如何查找请求映射路径?

时间:2016-02-10 17:09:15

标签: spring-mvc rest-assured

我们有一些控制器,比如说:

@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)。

处理此问题的最佳方法是什么?我是否必须在控制器上将映射公开为静态字符串?我宁愿至少避免这种情况。

2 个答案:

答案 0 :(得分:3)

类似的东西:

URI location = MvcUriComponentsBuilder.fromMethodCall(on(UserController.class).getUser("someUserId").build().toUri();

答案 1 :(得分:1)

我最终做了@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 "";
}

我不知道我们多久会使用它,但这是我能找到的最好的。

测试类中的用法:

when().get(mapping(UserAccessController.class, "getProjectProfiles"), projectId)
            .then().assertThat().body(....);