Java Apache Beam, имитация внешних клиентов, инициализированных в методе @Setup DoFn с переменными конструкторов.JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Java Apache Beam, имитация внешних клиентов, инициализированных в методе @Setup DoFn с переменными конструкторов.

Сообщение Anonymous »

Apache Beam рекомендует использовать Fakes вместо Mocks, поскольку Mocks не может сериализоваться по конвейеру.
Я пишу модульные тесты для старого кода, где класс использует Apache Beam, вызывающий другие службы внешних классов (которые я не написал или не могу изменить). * ServiceApi не использует интерфейс, однако при необходимости его можно обернуть в него.

Код: Выделить всё

public class DataAdapter extends DoFn{
public String processCategory;
public Map configs;
public transient ServiceApi serviceApi;

public DataAdapter(String processCategory, Map configs) {
this.processCategory = processCategory;
this.configs = configs;
}

@Setup
public void init() {
serviceApi = new ServiceApi(processCategory, configs);
}

@ProcessElement
public void processData(ProcessContext context, @Element KV input) {
try {
String productId = input.getKey();
serviceApi.getData();
....
}
}
Попытка:
Я создал подделку ниже. Вызов конструкторов с нулевыми значениями приведет к ошибкам исключения аргументов в конструкторе serviceApi. Итак, я попробовал шаблон создания фабрики, который, вероятно, не идеален. (пытается найти другое решение)
Однако подделка продолжает переопределяться, поскольку для каждого ProcessElement он вызывает программу установки с повторной инициализацией родительского класса. Нам пришлось инициализировать каждый пакет установки, поскольку serviceApi не подлежал сериализации при запуске приложения Apache Beam.
Создать подделку:

Код: Выделить всё

public class ServiceApiFake extends ServiceApi {

public ServiceApiFake() {
super(null, null);
}

public static ServiceApiFake create() {
try {
return new ServiceApiFake();
} catch (Exception ignore) {
return null;
}
}

@Override
public DataItem getData(String keyId) {
return null;
}
}
Тест:

Код: Выделить всё

TestStream testStream = TestStream.create(KvCoder.of(StringUtf8Coder.of(), SerializableCoder.of(Product.class)))
.addElements(KV.of("25", product)).advanceWatermarkToInfinity();

DataAdapter dataAdapter = new DataAdapter("productCategory", configs);
dataAdapter.serviceApi = new ServiceApiFake();
pipeline.apply(testStream).apply(ParDo.of(dataAdapter));
pipeline.run();
Ошибка при тестовом запуске: ArgumentExceptionError при инициализации установки, поскольку
возвращается к вызову обычной службы при установке вместо фиктивной.

Я подумал о том, чтобы вернуться к тестированию методов по отдельности, вызвав метод «processData» без вызова установки и используя макет Mockito для ProcessContext, ElementInput и serviceApi, когда (serviceApi .getData()).thenReturn(..) . Эта стратегия действительно работает, она не идеальна, но позволяет мне в некоторой степени протестировать ее. Обратите внимание, что API является временным свойством, так как в противном случае приложение выдаст ошибку. ServiceApi не использует интерфейс, однако при необходимости может включать его. Это старый проект, и он не использует Spring Boot или инжектор GoogleGuice.
Мне бы хотелось, чтобы у команды Apache Beam была лучшая и надежная альтернатива использованию подделок или каким-то образом разрешалась имитация. Или снова разрешите DoFnTester (поскольку в настоящее время он устарел). Политика компании больше не допускает устаревшего использования.
Ресурс: Я просмотрел ссылку на статью stackoverflow. Их serviceAPI не имеет переменных конструктора или валидаторов исключений аргументов внутри serviceAPI, поэтому он работает в их ситуации. Также он использует аннотацию VisibleForTesting, которая не рекомендуется в кодовой базе нашей компании.
Apache Beam имитирует внешние клиенты, инициализированные в методе @Setup Lifecycle DoFn

Подробнее здесь: https://stackoverflow.com/questions/784 ... f-dofn-wit
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»