JUnit, как настроить Джексона в MockMvc вместе с контекстом WebApplication

89
8

Я использую 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, поэтому я хотел бы перейти к контексту веб-приложения.

Любая помощь или намек будут заметны.

спросил(а) 2018-12-10T20:58:00+03:00 1 год, 9 месяцев назад
1
Решение
106

Я опубликую ниже то, что работало для меня до сих пор.

Тестовые классы снабжены пометкой:

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

Я надеюсь, что это помогает.

ответил(а) 2018-12-10T22:57:00+03:00 1 год, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема