JUnit, как настроить Джексона в MockMvc вместе с контекстом WebApplication - PullRequest
0 голосов
/ 10 декабря 2018

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

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

1 Ответ

0 голосов
/ 10 декабря 2018

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

Тестовые классы снабжены комментариями:

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

Надеюсь, это поможет.

...