Я пытался настроить некоторые модульные тесты, чтобы проверить логику в пользовательской реализации ForeachWriter, но столкнулся с проблемой насмешек / дублирования.
Я хотел бы смоделировать внедренную зависимость в ForeachWriter, но мои макеты, похоже, дублируются во время выполнения. Первоначально я думал, что ложные зависимости не вызывались, но во время проверки отладки я обнаружил, что существует несколько их версий (основанных на hashCode).
Вот небольшой пример кода того, что я пытался сделать:
//Class I'd like to test
public class TestForeachSink extends ForeachWriter<String> {
@Inject
SomeDependency dep;
public TestForeachSink(SomeDependency dep) {
this.dep = dep;
}
@Override
public boolean open(long partitionId, long version) {
dep.doSomethingStartupRelatedOrThrow();
return true;
}
@Override
public void process(String value) {
dep.processSomething(value);
}
@Override
public void close(Throwable errorOrNull) {
dep.closeConnections();
}
}
//Testing Class
public class TestForeachSinkTests {
@Mock SomeDependency _dep;
TestForeachSink target;
@BeforeEach
public void init() {
_dep = mock(SomeDependency.class, withSettings().serializable());
target = new TestForeachSink(_dep);
}
@Test
pubic void shouldVerifyDependencyInteractions() {
//setup stream, add data to it
stream.toDS().writeStream().foreach(target).start().processAllAvailable();
//VERIFY INTERACTIONS WITH MOCK HERE
}
}
Добавленные данные проходят через поток, как и ожидалось, но похоже, что макет, который я передал в SomeDependency
, заменяется во время выполнения копией. Я думаю , что имеет смысл, если выполнение выполняется так, как если бы оно выполнялось на отдельном работнике, но я все же хотел бы иметь возможность протестировать ForeachWriter.
Кто-нибудь еще тестирует эту часть кода? Я не сталкивался с какими-либо другими тестами для пользовательских реализаций ForeachSink, но руководство по продвижению было бы очень полезно!