我一直在尝试设置一些单元测试以验证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
的模拟在执行过程中被替换为副本。我认为,如果执行就像是在一个单独的worker上运行一样有意义,但是我仍然希望能够测试ForeachWriter。
有人在测试这部分代码吗?我还没有针对ForeachSink自定义实现进行过任何其他测试,但是前进的方向将非常感激!