2014-12-02 28 views
2

我使用彈簧3.2.0中的彈簧測試框架來測試我的彈簧mvc控制器。mockmvc standalonesetup如何注入freemarker viewresolver?

我試圖創建一個獨立的測試設置,所以我對所有變量進行了全面控制。 我已經用InternalResourceViewResolver進行了測試。 但現在我試圖使用freemarker作爲我的模板引擎,我無法弄清楚如何將freemarker配置作爲bean包含到獨立設置中。

下面的類:

@RunWith(MockitoJUnitRunner.class) 
public class StandAloneRegistrationControllerTest { 

private MockMvc mockMvc; 

@Mock 
private UserRegistrationService userRegistrationServiceMock; 

@Before 
public void setUp() { 
    mockMvc = MockMvcBuilders.standaloneSetup(new RegistrationController()) 
      .setViewResolvers(viewResolver()) 
      .build(); 
} 

private ViewResolver viewResolver() { 
    FreeMarkerViewResolver freeMarkerViewResolver = new FreeMarkerViewResolver(); 

    freeMarkerViewResolver.setCache(false); 
    freeMarkerViewResolver.setPrefix("/view/"); 
    freeMarkerViewResolver.setSuffix(".ftl"); 
    freeMarkerViewResolver.setContentType("text/html;charset=UTF-8"); 
    freeMarkerViewResolver.setRequestContextAttribute("rc"); 
    freeMarkerViewResolver.setExposeSpringMacroHelpers(true); 
    freeMarkerViewResolver.setExposeRequestAttributes(true); 
    freeMarkerViewResolver.setExposeSessionAttributes(true); 
    freeMarkerViewResolver.setAllowSessionOverride(true); 


    return freeMarkerViewResolver; 
} 

@Bean 
public FreeMarkerConfigurer freeMarkerConfigurer() { 
    FreeMarkerConfigurer configurer = new FreeMarkerConfigurer(); 
    configurer.setTemplateLoaderPath("/WEB-INF/"); 
    configurer.setDefaultEncoding("UTF-8"); 
    Properties settings = new Properties(); 
    settings.put("auto_import", "/view/layouts/layouts.ftl as layout,spring.ftl as spring"); 
    configurer.setFreemarkerSettings(settings); 

    return configurer; 
} 

@Test 
public void showAddTodoForm_ShouldCreateFormObjectAndRenderAddTodoForm() throws Exception { 
    mockMvc.perform(get("/register")) 
      .andExpect(status().isOk()); 

} 

} 

提供了以下異常:

org.springframework.web.util.NestedServletException: Request processing failed; 
nested exception is org.springframework.context.ApplicationContextException: 
Must define a single FreeMarkerConfig bean in this web application context (may be inherited): 
FreeMarkerConfigurer is the usual implementation. This bean may be given any name.; 
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type [org.springframework.web.servlet.view.freemarker.FreeMarkerConfig] is defined 

我怎樣才能freemarker的配置Bean增加的背景下,這樣我可以注入freemarker的視圖解析器到mockmvc獨立設置?

回答

0

我對MockMVC並不熟悉,但是您是否嘗試使用FreeMarker Configuration而不是setFreemarkerSettings

實施例:

@Bean 
public FreeMarkerConfigurer freeMarkerConfigurer(WebApplicationContext applicationContext) throws IOException, TemplateException { 
    FreeMarkerConfigurer configurer = new FreeMarkerConfigurer(); 

    freemarker.template.Configuration configuration = configurer.createConfiguration(); 
    configuration.addAutoInclude("/templates/include-common.ftl"); 
    configuration.setWhitespaceStripping(true); 

    configuration.setDefaultEncoding("UTF-8"); 
    configuration.setOutputEncoding("UTF-8"); 
    configuration.setURLEscapingCharset("UTF-8"); 
    configuration.setServletContextForTemplateLoading(applicationContext.getServletContext(), "/WEB-INF/ftl/"); 

    configurer.setConfiguration(configuration); 

    return configurer; 
}