2017-01-30 37 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 
    ... 
} 

はい、フォルダにはテンプレートがあります。

提案がありますか?

あなたは(クラス= {Application.class})の構成@ContextConfigurationの下に必要いけないような場合にのみ、コントローラをテストするために、スライスのテストを行っているすべての

+0

のような作品です。 '@ ContextConfiguration'に' WebMvcConfig'を直接追加してみてください。 –

+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(); 
    } 
} 

今、それはそれはテストのためのコンテキストのうち `WebMvcConfig`のように見える魅力

1

まず、

事前にさんに感謝してみてください:

@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

お返事ありがとうございます。私は後の時点でアプリケーション全体(複数のデータベース)を必要とします。そのため、私はcontextconfigurationを宣言しました。 –

+2

@ManuZiあなたはこのクラスであなたがやっていることを決める必要があります。ウェブスライステストを行い、完全なコンテキスト設定をしていると、互いに矛盾しています。 – eis

関連する問題