Рубрики
Без рубрики

Насмешка над методом ObjectMapper readValue()

Узнайте, как издеваться над методом readValue Джексона Objectmapper с помощью Mockito.

Автор оригинала: baeldung.

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 .