2016-08-10 2 views
0

Я разрабатываю веб-приложение Spring Boot, которое использует FreeMarker в качестве механизма шаблона.
У меня 1.4.0 версия spring-boot и использование автоконфигурации, есть интернационализация и несколько messages.properties для разных мест. Все работает отлично, в зависимости от текущего приложения локали возвращает HTML, сгенерированный FreeMarker, и заполняется строками из соответствующего .properties.Модульное тестирование приложения Spring Boot с помощью Freemarker throws NoSuchMessageException

Но когда я пытаюсь проверить контроллер, который работает правильно, я получаю NoSuchMessageException, FreeMarker не может найти строки в messages.properties.

Я реализовал модульное тестирование в соответствии со следующей статьей Testing improvements in Spring Boot 1.4

Вот код теста:

@RunWith(SpringRunner.class) 
@WebMvcTest(VideoController.class) 
public class VideoControllerTest { 

    @Autowired 
    private MockMvc mockMvc; 

    @MockBean 
    VideoService videoService; 

    @Test 
    public void showVideoSection() throws Exception { 
     ResultActions result = mockMvc.perform(MockMvcRequestBuilders.get("/video")); 
     result.andExpect(MockMvcResultMatchers.view().name("video")); 
    } 

} 

А вот код проверенного метода:

@RequestMapping(value = "/video", method = RequestMethod.GET) 
public String showVideoSection(Model model) { 
    model.addAttribute("currentLanguage", LocaleContextHolder.getLocale().getLanguage()); 
    long numberOfAvailableVideos = videoService.getNumberOfAvailableVideos(); 
    if (numberOfAvailableVideos > 0) { 
     if (numberOfAvailableVideos >= 5) { 
      model.addAttribute("videoList", videoService.getPageOfVideos(0, 5)); 
     } else { 
      model.addAttribute("videoList", videoService.getPageOfVideos(0, (int)numberOfAvailableVideos)); 
     } 
    } 
    return "video"; 
} 

Ниже Пакетирование след:

2016-08-10 17:07:32.210 ERROR 5504 --- [main] freemarker.runtime: Error executing FreeMarker template 

freemarker.core._TemplateModelException: Java method "org.springframework.web.servlet.support.RequestContext.getMessage(String)" threw an exception when invoked on org.springframework.web.servlet.support.RequestContext object "[email protected]"; see cause exception in the Java stack trace. 

---- 
FTL stack trace ("~" means nesting-related): 
- Failed at: ${springMacroRequestContext.getMessag... [in template "spring.ftl" in macro "message" at line 28, column 22] 
- Reached through: @spring.message code="nav.video" [in template "common.ftl" in macro "body" at line 65, column 49] 
- Reached through: @common.body mode="video" language="$... [in template "video.ftl" at line 7, column 5] 
~ Reached through: #nested [in template "common.ftl" in macro "html" at line 12, column 5] 
~ Reached through: @common.html [in template "video.ftl" at line 5, column 1] 
---- 

... 
... 
Caused by: org.springframework.context.NoSuchMessageException: No message found under code 'nav.video' for locale 'en'. 
at org.springframework.context.support.DelegatingMessageSource.getMessage(DelegatingMessageSource.java:69) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.context.support.AbstractApplicationContext.getMessage(AbstractApplicationContext.java:1254) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.web.servlet.support.RequestContext.getMessage(RequestContext.java:711) ~[spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.web.servlet.support.RequestContext.getMessage(RequestContext.java:677) ~[spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_77] 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_77] 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_77] 
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_77] 
at freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:1458) ~[freemarker-2.3.25-incubating.jar:2.3.25] 
at freemarker.ext.beans.ReflectionCallableMemberDescriptor.invokeMethod(ReflectionCallableMemberDescriptor.java:56) ~[freemarker-2.3.25-incubating.jar:2.3.25] 
at freemarker.ext.beans.MemberAndArguments.invokeMethod(MemberAndArguments.java:51) ~[freemarker-2.3.25-incubating.jar:2.3.25] 
at freemarker.ext.beans.OverloadedMethodsModel.exec(OverloadedMethodsModel.java:61) ~[freemarker-2.3.25-incubating.jar:2.3.25] 
... 79 common frames omitted 

ответ

1

Мое лучшее предположение, что MessageSourceAutoConfiguration необходимо запустить, чтобы правильно обрабатывать файлы message.properties. На данный момент это не так (и что-то, что мы, вероятно, должны исправить в Spring Boot 1.4.1).

Вы могли бы быть в состоянии обойти эту проблему, добавив src/test/resources/META-INF/spring.factories файл со следующим содержанием:

org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureWebMvc=\ 
org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration 

Я поднял https://github.com/spring-projects/spring-boot/issues/6608, чтобы исправить это. Если у вас есть образец проекта, который реплицирует проблему, вы можете прикрепить ссылку на отчет об ошибке.

+0

Благодарим за отзыв! –

+0

К сожалению, добавление 'spring.factories' не решило эту проблему. Я новичок в Spring Boot, и я пытаюсь создать свой собственный сайт, используя его, вот последняя фиксация [link] (https://github.com/Irgalin/klarigo/commit/5b004b928ad0c46c5b5a4d2a548ee88094b4df22). Я создал отдельную ветку для этой проблемы, надеюсь, что это не вызвано моей глупостью, было бы позором:) –

+0

Мне удалось заставить это работать ... проблема была 'spring.factories' должна быть под' SRC/главная/тест/ресурсы/META-INF/'. Также ваш файл, который был совершен, удалил новую строку после равных. Если вы хотите, чтобы все это как одна строка, вам не нужен символ escape-строки новой строки. Если вам нужно только сделать «MessageSourceAutoConfiguration» на одном или двух тестах, вы можете использовать '@ImportAutoConfiguration (MessageSourceAutoConfiguration.class)' для тестового класса. –

Смежные вопросы