Spring boot 2 тестирует сериализацию json - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть следующий тест, и он работает нормально. Однако, на мой взгляд, это немного излишне. (также требуется некоторое время), чтобы вызвать полный экземпляр spring для проверки некоторой сериализации json.

@RunWith(SpringRunner.class)
@SpringBootTest
public class WirelessSerializationTest {

  @Autowired
  ObjectMapper objectMapper;

  @Test
  public void testDateSerialization() throws IOException {

    Resource resource = new ClassPathResource("subscription.json");
    File file = resource.getFile();

    CustomerSubscriptionDto customerSubscriptionDto = objectMapper.readValue(file, CustomerSubscriptionDto.class);
    LocalDateTime actualResult = customerSubscriptionDto.getEarliestExpiryDate();

    LocalDate expectedDate = LocalDate.of(2018, 10, 13);
    LocalTime expectedTime = LocalTime.of( 10, 18, 48);
    LocalDateTime expectedResult = LocalDateTime.of(expectedDate,expectedTime);
    Assert.assertEquals("serialised date ok", expectedResult, actualResult);

    String jsonOutput = objectMapper.writeValueAsString(customerSubscriptionDto);
    String expectedExpiryDate = "\"earliestExpiryDate\":\"2018-10-13T10:18:48Z\"";

  }

}

Теперь я смог упростить это, удалив SpringRunner. Однако я не загружаю конфигурации пружин Джексона здесь.

public class WirelessSerializationTest {

  //@Autowired
  ObjectMapper objectMapper = new ObjectMapper();

Так что мой вопрос таков. Могу ли я протестировать и загрузить экземпляр Springs ObjectMapper в тесте, не загружая весь Spring?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Да, просто инициализируйте его как часть вашего теста. Вам не нужна полная SpringRunner вещь, если вам не нужно загружать контекст Spring.

ObjectMapper не является частью Spring, он является частью Jackson, и вы можете создать его экземпляр без контекста Spring. Просто будьте осторожны, если у вас есть какая-либо специальная конфигурация, которую вы используете в своем приложении для ObjectMapper, чтобы убедиться, что вы копируете ее.

Например (здесь я настроил 2 варианта только для иллюстрации):

private ObjectMapper objectMapper = Jackson2ObjectMapperBuilder().build()                                      
    .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
    .setSerializationInclusion(Include.NON_ABSENT);

Вы также можете создать MockMvc Spring, чтобы имитировать HTTP-запросы к нему, запускать ваши контроллеры и передавать его ObjectMapper, при этом без необходимости использовать тяжелый SpringRunner.

0 голосов
/ 01 ноября 2018

Используйте @JsonTest вместо @SpringBootTest

https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/autoconfigure/json/JsonTest.html

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications-testing-autoconfigured-json-tests

Он загрузит фрагмент контекста, относящегося к сериализации Джексона, и еще несколько тонкостей для тестирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...