如何对ForeachWriter实现进行单元测试?

时间:2019-01-11 17:40:57

标签: apache-spark spark-structured-streaming

我一直在尝试设置一些单元测试以验证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自定义实现进行过任何其他测试,但是前进的方向将非常感激!

0 个答案:

没有答案