2017-01-30 32 views
2

首先,應用程序正在成功編譯和運行。Spring junit測試模板可能不存在

我嘗試在春季啓動時對我的控制器進行單元測試。我的測試控制器的樣子:

@RunWith(SpringRunner.class) 
@ContextConfiguration(classes = { Application.class }) 
@Rollback 
@Transactional 
@WebMvcTest(PasswordResetController.class) 
public class PasswordResetControllerTest { 
    @Autowired 
    private MockMvc mvc; 

    @Test 
    public void getPasswordForgetView() throws Exception { 
     this.mvc.perform(get("/password/forget")) 
      .andExpect(status().isOk()); 
    } 
} 

有了這個,我得到下面的異常:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template "password-forget-html", template might not exist or might not be accessible by any of the configured Template Resolvers 

,如果我調試配置,我看到它那張槽我WebMvcConfig.class在那裏我點的模板/WEB-INF/templates/文件夾:

@Configuration 
@ComponentScan(basePackages = { "com.tmp" }) 
public class WebMvcConfig extends WebMvcConfigurerAdapter { 

    @Value("${mail.templates.cacheable}") 
    private boolean mailTemplatesCacheable; 

    @Value("${html.templates.cacheable}") 
    private boolean htmlTemplatesCacheable; 

    public static final String URL_RESOURCES = "/modules/**"; 
    public static final String PATH_RESOURCES = "/modules/"; 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler(URL_RESOURCES).addResourceLocations(PATH_RESOURCES); 
    } 

    @Override 
    public void addViewControllers(ViewControllerRegistry registry) { 
     registry.addViewController("/login").setViewName("login"); 
    } 

    @Bean 
    public TemplateResolver templateResolver() { 
     SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); 
     templateResolver.setPrefix("/WEB-INF/templates/"); 
     templateResolver.setSuffix(".html"); 
     templateResolver.setTemplateMode("HTML5"); 
     templateResolver.setCharacterEncoding("UTF-8"); 
     templateResolver.setCacheable(htmlTemplatesCacheable); 
     return templateResolver; 
    } 

    @Bean 
    public TemplateResolver mailResolver() { 
     SpringResourceTemplateResolver result = new SpringResourceTemplateResolver(); 
     result.setPrefix("/WEB-INF/mail/"); 
     result.setSuffix(".html"); 
     result.setTemplateMode("HTML5"); 
     result.setCacheable(mailTemplatesCacheable); 
     result.setOrder(2); 
     result.setCharacterEncoding("UTF-8"); 
     return result; 
    } 

    @Bean 
    public SpringTemplateEngine templateEngine() { 
     SpringTemplateEngine templateEngine = new SpringTemplateEngine(); 
     templateEngine.addTemplateResolver(templateResolver()); 
     templateEngine.addTemplateResolver(mailResolver()); 
     templateEngine.addDialect("java8time", java8TimeDialect()); 
     templateEngine.addDialect("sec", springSecurityDialect()); 
     templateEngine.addDialect("layout", thymeleafLayoutDialect()); 
     return templateEngine; 
    } 

    @Bean 
    public ThymeleafViewResolver viewResolver() { 
     ThymeleafViewResolver thymeleafViewResolver = new ThymeleafViewResolver(); 
     thymeleafViewResolver.setTemplateEngine(templateEngine()); 
     thymeleafViewResolver.setCharacterEncoding("UTF-8"); 
     thymeleafViewResolver.setCache(false); 
     return thymeleafViewResolver; 
    } 

    // Dialect Beans 
    ... 
} 

是的,該文件夾中有模板。

有什麼建議嗎?感謝的提前

+0

它看起來像'WebMvcConfig'斷章取義的測試工作。嘗試直接將'WebMvcConfig'添加到'@ ContextConfiguration'中。 –

+0

如果我調試它,它會通過WebMvcConfig類 –

+0

'/ WEB-INF/templates /'在類路徑中是否可見? –

回答

0

來自@eis的評論我得到了解決方案。註釋WebMvcTestContextConfiguration相互矛盾。我類更改爲以下:

@RunWith(SpringRunner.class) 
@SpringBootTest(classes = { Application.class }) 
public class PasswordResetControllerTest { 

    @Autowired 
    private WebApplicationContext applicationContext; 

    private MockMvc mockMvc; 

    ... 

    @Before 
    public void init() { 
     this.mockMvc = MockMvcBuilders.webAppContextSetup(this.applicationContext).build(); 
    } 
} 

現在它像一個魅力

1

首先,

你正在做切片試驗,在你不需要下面的配置@ContextConfiguration這種情況下,單獨測試控制器(類= {} Application.class)

嘗試:

@RunWith(SpringRunner.class) 
@Transactional 
@WebMvcTest(PasswordResetController.class) 
public class PasswordResetControllerTest { 
    @Autowired 
    private MockMvc mvc; 

    @Test 
    public void getPasswordForgetView() throws Exception { 
     this.mvc.perform(get("/password/forget")) 
      .andExpect(status().isOk()); 
    } 
} 
+0

感謝您的迴應。我稍後需要整個應用程序(多數據庫),這就是爲什麼我聲明瞭上下文配置的原因。 –

+2

@ManuZi你需要決定你在這個班級中做了哪一個,做一個web切片測試,並且具有完整的上下文配置相互矛盾。 – eis