невозможно сериализовать 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 Обновлю сообщение после попытки.
спасибо, Дин