我是 Spring 新手,这是我在 Stack Overflow 上的第一个问题,我的英语也很基础...
我目前正在关注 http://spring.io/guides/tutorials/web/3/ 并且我不明白为什么 MvcMock 可以执行
get("/bbb")
并到达我的控制器(映射到 @RequestMapping("/bbb")
)甚至 AbstractAnnotationConfigDispatcherServletInitializer
将 DispatcherSevlet
映射限制为 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)));
}
}
非常感谢您的帮助!
劳伦特
答案是您的
MockMvc
配置未使用您的 WebAppInitializer
。 Spring MVC 测试套件目前不支持此功能。 请注意您尚未在任何地方注册。您所做的就是使用 设置上下文配置
@ContextConfiguration(classes = { PersistenceConfig.class, CoreConfig.class, WebConfig.class })
有了这个并且
@WebAppConfiguration
MockMvc
将在您的上下文中(以及它查找的其他内容)中向 DispatcherServlet
类注册 @Controller
。然后它将使用该配置运行测试。该配置中没有 /aaa
。所有路径都是绝对路径,因为它们在您的 @Controller
类中声明。