Spring Cloud Contract - возможно ли использовать двоичную полезную нагрузку в теле сообщения о контракте

Из справочной документации весеннего облачного контракта возможен следующий договор на основе обмена сообщениями

def contractDsl = Contract.make {
label 'some_label'
input {
    messageFrom('jms:delete')
    messageBody([
            bookName: 'foo'
    ])
    messageHeaders {
        header('sample', 'header')
    }
    assertThat('bookWasDeleted()')
}

Можно ли использовать альтернативный тип тела сообщения, который не является строкой json, например, полезную нагрузку, которая использует механизм двоичной сериализации?

Если так, возможно ли будет использовать метод из базового класса тестирования контракта для возврата этого тела сообщения?

1 ответ

Решение

В Finchley, по крайней мере для поддержки Spring Cloud Stream, мы конвертируем тело в байты из всего, что вы там передаете. Если вам не нравятся настройки по умолчанию, вы можете реализовать свои собственные org.springframework.cloud.contract.verifier.messaging.MessageVerifier интерфейс, чтобы сказать нам, как отправлять и получать сообщения. Это должно работать без проблем для стороны производителя. К сожалению, с потребительской стороны будут проблемы:|

Проблема в том, что в настоящее время, когда у вас есть регистр ввода / вывода, мы пытаемся использовать тело напрямую, так как оно соответствует вашему входящему сообщению с тем, что вы определили в контракте через JSON Paths. Таким образом, двоичный протокол здесь потерпит неудачу (проверьте org.springframework.cloud.contract.stubrunner.messaging.stream.StubRunnerStreamMessageSelector учебный класс). Я вижу еще одну проблему org.springframework.cloud.contract.stubrunner.messaging.stream.StubRunnerStreamTransformer поэтому преобразователь, который мы используем для запуска сообщения. Предполагается, что тело является String JSON, а затем преобразует его в байты.

Таким образом, короткий ответ заключается в том, что в настоящее время он не поддерживается должным образом. ОДНАКО, благодаря подключаемому характеру Spring Cloud Contract, вы можете полностью отменить это поведение. Вы можете в основном отключить поддержку потока по умолчанию через свойство stubrunner.stream.enabled=falseскопируйте содержимое org.springframework.cloud.contract.stubrunner.messaging.stream пакет, измените его в соответствии с вашими потребностями и зарегистрируйте бобы. Я знаю, что это не тот ответ, на который вы надеялись, но я создал проблему ( https://github.com/spring-cloud/spring-cloud-contract/issues/664), чтобы мы не забыли о это в будущих выпусках.

Другие вопросы по тегам