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 .