JUnit, как настроить Джексона в MockMvc вместе с контекстом WebApplication
Я использую spring-boot-1.5.10 вместе с весенним тестом безопасности и spring-boot-hateoas и JUnit-5. У меня есть некоторая пользовательская конфигурация Джексона в моем приложении. MockMvc в модульном тесте не выбирает эту пользовательскую конфигурацию Джексона. Я хотел бы знать, как внедрить эти конфигурации в MockMvc вместе с тем, что я хотел бы знать, как внедрить пользовательский модуль Джексона в MockMvc. Пожалуйста, найдите ниже код для справки,
@RunWith(SpringRunner.class)
@WebMvcTest(BookController.class)
public class BookControllerTests {
@Autowired
private MockMvc mockMvc;
@Autowired
private WebApplicationContext context;
@MockBean
private BookService bookService;
@Before
public void setup() {
mockMvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(SecurityMockMvcConfigurers.springSecurity()) //Here i would also like to configure Jackson
.build();
}
@Test
@WithMockApiUser(roles = {"API_ADMIN"})
public void shouldGetBook() throws Exception {
BookResponse bookResponse = BookResponse.builder()
.basicInfo(getBasicInfo())
.extendedInfo(getExtendedInfo())
.build();
given(bookService.getBook(apiAuthentication.getApiContext(),"bookUid")).willReturn(bookResponse);
System.out.println("Input ::"+objectMapper.writeValueAsString(bookResponse)); //Here the json string response looks fine.
MvcResult result = mockMvc.perform(get("/v1/books/bookUid"))
.andExpect(status().isOk())
.andExpect(content().contentType("application/hal+json"))
.andExpect(jsonPath("bookUid").value("bookUid")).andReturn();
System.out.println("response::"+objectMapper.writeValueAsString(result.getResponse().getContentAsString())); //Here the content string is not properly converted by Jackson
verifyNoMoreInteractions(bookService);
}
}
JACKSON КОНФИГУРАЦИОННЫЙ КЛАСС
@Configuration
public class ObjectMapperConfiguration {
@Autowired
private ObjectMapper objectMapper;
@PostConstruct
public void init() {
objectMapper.registerModule(new JavaTimeModule());
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
}
}
Я погуглил об этой проблеме, но все ссылки используют StandaloneSetUp, но в моем приложении мы используем Spring-Security, поэтому я хотел бы перейти к контексту веб-приложения.
Любая помощь или намек будут заметны.
Я опубликую ниже то, что работало для меня до сих пор.
Тестовые классы снабжены пометкой:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {MyApplication.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestPropertySource(properties = {
"app.config1.enable=false"
, "app.xonfig2.enable=false"
})
Это полезно, когда я хочу включить или отключить конфигурацию во время этого набора тестов. Чтобы это работало, классы конфигурации должны содержать:
@Configuration
@ConditionalOnProperty(
value = "app.config1.enable", havingValue = "true", matchIfMissing = true
)
public class MyConfig1 {
.
.
.
}
Применяя это в вашем случае, просто включите конфигурацию Джексона, и она должна работать. Если вы не хотите включать конфигурации по отдельности, пропустите эту часть и добавьте только @SpringBootTest(classes = {MyApplication.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
.
Я надеюсь, что это помогает.