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

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

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

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

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

1 Ответ

0 голосов
/ 08 июня 2018

В 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), чтобы мы не забыли об этом в будущих выпусках.

...