首页 > 解决方案 > 你如何对 ForeachWriter 实现进行单元测试?

问题描述

我一直在尝试设置一些单元测试来验证 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 自定义实现的测试,但是非常感谢您的前进方向!

标签: apache-sparkspark-structured-streaming

解决方案


推荐阅读