Я разрабатываю веб-приложение 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
Благодарим за отзыв! –
К сожалению, добавление 'spring.factories' не решило эту проблему. Я новичок в Spring Boot, и я пытаюсь создать свой собственный сайт, используя его, вот последняя фиксация [link] (https://github.com/Irgalin/klarigo/commit/5b004b928ad0c46c5b5a4d2a548ee88094b4df22). Я создал отдельную ветку для этой проблемы, надеюсь, что это не вызвано моей глупостью, было бы позором:) –
Мне удалось заставить это работать ... проблема была 'spring.factories' должна быть под' SRC/главная/тест/ресурсы/META-INF/'. Также ваш файл, который был совершен, удалил новую строку после равных. Если вы хотите, чтобы все это как одна строка, вам не нужен символ escape-строки новой строки. Если вам нужно только сделать «MessageSourceAutoConfiguration» на одном или двух тестах, вы можете использовать '@ImportAutoConfiguration (MessageSourceAutoConfiguration.class)' для тестового класса. –