2017-01-30 4 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 /' видимым в classpath? –

ответ

0

с комментариями от @eis Я получил решение. аннотации WebMvcTest и ContextConfiguration противоречат друг другу. Изменить класс к следующему:

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

Try :

@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 вам нужно решить, какой из них вы делаете в этом классе, выполняя тест веб-среза и имея полную контекстную конфигурацию, противоречат друг другу. – eis