Spring: Mocking REST API Web Service

Тестировщику часто приходится сталкиваться с задачей написания автоматизированных модульных тестов. Особенность данного тестирования, не требуется полной интеграции, так как необходимо проверить на соответствие требованиям отдельные модули. Сторонние модули нам не интересны на данном этапе, и можно замокировать ожидаемые ответы от них. Существует множество подходов к решению этой задачи, от готовых java библиотек и целых фреймворков к примеру mockito, до написания собственной mock заглушки с последующим деплоем на сервере приложений.

Задание:
Написать REST API Web Service на Spring Boot. Реализовать метод GET, который будет возвращать JSON сообщение в ответе и метод POST (с логикой) который на вход принимает JSON сообщение десириализует его и в зависимости от значения параметров отдает необходимый ответ. Стартовать WEB Service и проверить корректность работы.

Использовал:

API RESTFull Json Spring Boot

Для создания проекта удобно воспользоваться Spring Boot Startes:

Для примера POST запрос в формате JSON:

{
 "rqUid":"abdfabfa68466a5aef768fadd4223333",
 "messages":{
   "id":"abcd1111abcd1111abcd1111abcd2222",
   "type":"WAY4-A",
   "cardNumbers":"4444000022221111"
 }
}

Добавим немного логики в ответе, если на входящем сообщении cardNumbers = 4***, то в ответе должны получить:

{
    "value":"4444000022221111",
    "statusRule":{
       "code":"SUCCESS",
       "desc":"Успешно обработано"
    },
    "timeout":10
}

Ну и если cardNumbers != 4***, то в ответе:

{
    "value":"4444000022221111",
    "statusRule":{
       "code":"FAIL",
       "desc":"Сообщение не обработано"
    },
    "timeout":10
}

Итак в проекте задействовано 2 сообщения в формате JSON. Следующим этапом необходимо описать POJO классы для работы с ними. Для описания POJO использую библиотеки lombok и jackson 2.

import com.fasterxml.jackson.annotation.JsonView;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
 
/**
 * @author Muflikhunov Roman
 */
 
@Getter
@Setter
@ToString
public class PhonesByCardNumberRq {
    @JsonView
    private String rqUid;
    @JsonView
    Messages MessagesObject;
}

Далее создаем класс Controller в котором реализовываем методы работы нашей заглушки.

@RequestMapping(value = "/checkCard", method = RequestMethod.POST)
    public ResponseEntity checkCard(@RequestBody PhonesByCardNumberRq phonesByCardNumberRq){
        PhonesByCardNumberRs phonesByCardNumberRs = new PhonesByCardNumberRs();
        phonesByCardNumberRs.setValue(phonesByCardNumberRq.getMessages().getCardNumbers());
        StatusRule statusRule = new StatusRule();
        statusRule.setCode("FAIL");
        statusRule.setDesc("Сообщение не обработано");
        phonesByCardNumberRs.setStatusRuleObject(statusRule);
        phonesByCardNumberRs.setTimeout(10L);
 
        if (phonesByCardNumberRq.getMessages().getCardNumbers().matches("^4.*")) {
            statusRule.setCode("SUCCESS");
            statusRule.setDesc("Успешно обработано");
        }
        return new ResponseEntity<>(phonesByCardNumberRs, HttpStatus.OK);
    }

Использую класс ResponseEntity который является оберткой для ответа и дополнительно для HTTP заголовков и кода статуса, можно контролировать все, что входит в него: код состояния, заголовки и тело.

Ссылка на полную версию проекта на GitHub:
Github SpringMockWebService

Releated Post