虽然servlet映射过滤,但MockMvc到达@Controller类

时间:2013-10-13 10:56:31

标签: spring spring-mvc

我是Spring的新手,这是我在Stack Overflow中的第一个问题,我的英语也很基本......

我目前正在关注http://spring.io/guides/tutorials/web/3/,我不明白为什么MvcMock可以执行get("/bbb")并到达我的控制器(映射到@RequestMapping("/bbb"))甚至AbstractAnnotationConfigDispatcherServletInitializerDispatcherSevlet映射限制为new String[] { "/aaa" };

以下是涉及的代码......

Spring WebAppInitializer

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class<?>[] { PersistenceConfig.class, CoreConfig.class };
}

@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[] { WebConfig.class };
}

@Override
protected String[] getServletMappings() {
    return new String[] { "/aaa" };
}

@Override
protected Filter[] getServletFilters() {

    CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
    characterEncodingFilter.setEncoding("UTF-8");
    return new Filter[] { characterEncodingFilter };
}
}

Spring控制器

@Controller
@RequestMapping("/bbb")
public class SiteController {

private static final Logger LOG = LoggerFactory.getLogger(SiteController.class);

@Autowired
private MenuService menuService;

@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public String getCurrentMenu() {
    ...
}

传递的JUnit测试

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = { PersistenceConfig.class, CoreConfig.class, WebConfig.class })
public class WebDomainIntegrationTest {

private static final String STANDARD = "Yummy Noodles";
private static final String CHEF_SPECIAL = "Special Yummy Noodles";
private static final String LOW_CAL = "Low cal Yummy Noodles";

private MockMvc mockMvc;

@Autowired
WebApplicationContext webApplicationContext;

@Before
public void setup() {
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}

@Test
public void thatTextReturned() throws Exception {
            mockMvc.perform(get("/bbb")).andDo(print()).andExpect(content().string(containsString(STANDARD)))
            .andExpect(content().string(containsString(CHEF_SPECIAL))).andExpect(content().string(containsString(LOW_CAL)));

}

}

非常感谢你的帮助!

劳伦

1 个答案:

答案 0 :(得分:7)

欢迎使用Stackoverflow!这是一个很好的第一个问题。

答案是您的MockMvc配置未使用您的WebAppInitializerThis currently isn't supported by the Spring MVC test suite.注意你没有在任何地方注册。您所做的就是使用

设置上下文配置
@ContextConfiguration(classes = { PersistenceConfig.class, CoreConfig.class, WebConfig.class })

有了这个和

@WebAppConfiguration

MockMvc将在您的上下文中注册DispatcherServlet@Controller类(以及其查找的其他内容)。然后它将使用该配置运行测试。该配置中没有/aaa。所有路径都是绝对的,因为它们是在@Controller类中声明的。