Apache bean не может быть сериализован из-за интерфейса, который я хочу издеваться

невозможно сериализовать DoFnWithExecutionInformation{doFn=com.orderly.dataflow.RosterFileReader@60ec7684, mainOutputTag=Tag, sideInputMapping={}, schemaInformation=DoFnSchemaInformation{elementConverters=[]}} java.lang.IllegalArgumentException: невозможно сериализовать DoFnWithExecutionInformation{doFn=com .orderly.dataflow.RosterFileReader@60ec7684, mainOutputTag=Tag, sideInputMapping={}, schemaInformation=DoFnSchemaInformation{elementConverters=[]}}

Я не уверен, что это возможно. Я понимаю, что в apache beam эти функции должны быть сериализуемыми для масштабирования, но во время тестирования я также хочу издеваться над тем, откуда мы читаем.

Есть ли какой-то контекст или что-то, что я могу создать, чтобы внедрить интерфейс, который можно издеваться над чтением?

Вот мой код

public class RosterFileReader extends DoFn<String, PractitionerStandardOutputDto> {

    private static final Logger log = LoggerFactory.getLogger(RosterFileReader.class);

    private final String projectId;
    private GCPBucketStorage storage;

    public RosterFileReader(String projectId, GCPBucketStorage storage) {

Мне интересно, есть ли контекст, который я могу отправить? GCPBucketStorage.java — это НАШ API, так как googles не был настолько издевательским. Таким образом, у нас есть полный контроль над созданием исключений и тестированием восстановления, а также над другими сценариями.

РЕДАКТИРОВАТЬ: я бы согласился на такой код

if(isRunningLocally) {
     storage = new MockStorage();
} else { 
     storage = new GCPBucketStorageImpl();
}

в принципе, это отстойно иметь такой тестовый код в производственном коде, но этот тест END to END уже обнаружил ошибки !!!!!! ошибки, пропущенные при модульном тестировании, которое делают люди. Как правило, мы не проводим одноклассовое или модульное тестирование, а делаем только то, что в Твиттере называется тестированием функций, поскольку оно позволяет проводить масштабные рефакторинги, не затрагивая тесты. /2017/the-testing-renaissance.html" rel="nofollow noreferrer">https://blog.twitter.com/engineering/en_us/topics/insights/2017/the-testing-renaissance.html

Думаю, я могу получить доступ к Mock, используя статические поля (опять же, я ненавижу это делать, но этот тест настолько ценен, что он действительно идет от начала до конца)

РЕДАКТИРОВАТЬ 2: Является ли сериализация тонной, похожей на хауп, где вам нужно определить классы для развертывания вместе с основным банком? Возможно, мне просто нужен документ, чтобы сделать GCPStorage и GCPBucketStorageImpl сериализуемыми (и MockStorage, скорее всего, так как он находится в рабочем коде :( ) -> if..else полностью стоит того из-за ошибок интеграции, которые мы находим до CI, поэтому люди никогда не взламывают код на мастере.

РЕДАКТИРОВАТЬ 3: Это выглядит очень многообещающе -› https://gist.github.com/jlewi/f1cd323dc88bd58601ef Обновлю сообщение после попытки.

спасибо, Дин


person Dean Hiller    schedule 09.04.2021    source источник


Ответы (1)


На самом деле, просто сделать интерфейс сериализуемым, похоже, работает в тесте (еще не тестировалось в производстве). Наряду с этой последней строкой в ​​​​производственном коде, которая уродлива (и мне интересно, могу ли я вместо этого внедрить это) ->

введите здесь описание изображения

да, довольно некрасиво иметь тестовый код в производстве :(. Самое БОЛЬШОЕ стоит отметить, что вместо внедрения интерфейса я ввожу GCPBucketStorageImpl.java (наша реализация продукта) и теперь передаю макет (который является подклассом класса продукта < /strong> ‹---- Это сделано для того, чтобы мы получили тестовую проверку на то, что кто-то модифицирует производственный класс, чтобы он не был сериализуемым, и в этом случае мы не обнаружили бы проблему.

person Dean Hiller    schedule 09.04.2021