1. Обзор
При модульном тестировании кода, который включает десериализацию JSON с помощью Jackson, нам может быть проще издеваться над методом ObjectMapper#readValue . Таким образом, нам не нужно указывать длинные входные данные JSON в наших тестах.
В этом уроке мы увидим, как мы можем достичь этого с помощью Mockito .
2. Зависимости Maven
Прежде всего, в качестве зависимостей Maven мы будем использовать mockito-core и jackson-databind :
org.mockito mockito-core 3.3.3 test com.fasterxml.jackson.core jackson-databind 2.10.3 bundle
3. Пример ObjectMapper
Давайте рассмотрим простой Цветок класс:
public class Flower { private String name; private Integer petals; public Flower(String name, Integer petals) { this.name = name; this.petals = petals; } // default constructor, getters and setters }
И предположим, что у нас есть класс для проверки строкового представления JSON объекта Flower . Он принимает ObjectMapper в качестве аргумента конструктора — это позволяет нам легко издеваться над ним позже:
public class FlowerJsonStringValidator { private ObjectMapper objectMapper; public FlowerJsonStringValidator(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } public boolean flowerHasPetals(String jsonFlowerAsString) throws JsonProcessingException { Flower flower = objectMapper.readValue(jsonFlowerAsString, Flower.class); return flower.getPetals() > 0; } }
Далее мы будем использовать Mockito для написания модульных тестов для логики валидатора.
4. Модульное Тестирование С Помощью Mockito
Давайте начнем с настройки вашего тестового класса. Мы можем легко издеваться над ObjectMapper и передавать его в качестве аргумента конструктора в наш класс Flower StringValidator :
@ExtendWith(MockitoExtension.class) public class FlowerJsonStringValidatorUnitTest { @Mock private ObjectMapper objectMapper; private FlowerJsonStringValidator flowerJsonStringValidator; @BeforeEach public void setUp() { flowerJsonStringValidator = new FlowerJsonStringValidator(objectMapper); } ... }
Обратите внимание, что мы используем JUnit 5 в наших тестах, поэтому мы аннотировали наш тестовый класс с помощью @ExtendWith(MockitoExtension.class) .
Теперь, когда у нас есть наш макет ObjectMapper готов к работе, давайте напишем простой тест:
@Test public void whenCallingHasPetalsWithPetals_thenReturnsTrue() throws JsonProcessingException { Flower rose = new Flower("testFlower", 100); when(objectMapper.readValue(anyString(), eq(Flower.class))).thenReturn(rose); assertTrue(flowerJsonStringValidator.flowerHasPetals("this can be a very long json flower")); verify(objectMapper, times(1)).readValue(anyString(), eq(Flower.class)); }
Поскольку мы здесь издеваемся над ObjectMapper , мы можем игнорировать его ввод и сосредоточиться на его выводе , который затем передается в фактическую логику валидатора. Как мы видим, нам не нужно указывать допустимые входные данные JSON, которые могут быть очень длинными и сложными в реальном сценарии.
5. Заключение
В этой статье мы рассмотрели, как издеваться над ObjectMapper , чтобы обеспечить эффективные тестовые случаи вокруг него. Наконец, код можно найти на GitHub .