【问题标题】:Apache Beam , mock external Clients initialized in @Setup Lifecycle method of DoFnApache Beam,模拟在 DoFn 的 @Setup Lifecycle 方法中初始化的外部客户端
【发布时间】:2021-06-01 03:54:58
【问题描述】:

我已经创建了以下 DoFn 类,但我不确定如何模拟 APIClient,因为在 Junit 中使用模拟 APICall 对象创建 JsonToGenericRecordMapper 的实例被 @setup 方法覆盖,该方法正在创建 APICall 的实际实例?

public class JsonToGenericRecordMapper extends DoFn<String, GenericRecord> {
    
    private APICall apiCall;
    
     @setup
     public void setup () 
    {
        api = new APICall();
    }
    
    @ProcessElement
    public void processElement(ProcessContext processContext) {

        String enrichedItemCost = processContext.element();

        Schema schema = CommonUtils.schema;
        GenericRecord genericRecord = new GenericData.Record(schema);
        genericRecord.put(CommonUtils.SCHEMA_FIELD_KEY, enrichedItemCost);

        processContext.output(genericRecord);
    }
}




TestPipeline testPipeline = TestPipeline.create();
APICAll apiCall = Mockito.mock(APICall.class);
dataPCollection.apply(new JsonToGenericRecordMapper(apiCall));

【问题讨论】:

    标签: java unit-testing mockito google-cloud-dataflow apache-beam


    【解决方案1】:

    您可以创建两个构造函数(一个空的,一个带有 APICall 参数的),并使用其中一个进行测试,类似这样(我只是扩展了您的示例以了解重点,所以这只是一个示例):

    public class JsonToGenericRecordMapper extends DoFn<String, GenericRecord> {
    
    private APICall apiCall;
    
    public JsonToGenericRecordMapper() {
    }
    
    public JsonToGenericRecordMapper(APICall apiCall) {
        this.apiCall = apiCall;
    }
    
    
     @setup
     public void setup () 
     { 
        if(apiCall==null) {
            api = new APICall();
        }
     }
    
    @ProcessElement
    public void processElement(ProcessContext processContext) {
    
        String enrichedItemCost = processContext.element();
    
        Schema schema = CommonUtils.schema;
        GenericRecord genericRecord = new GenericData.Record(schema);
        genericRecord.put(CommonUtils.SCHEMA_FIELD_KEY, enrichedItemCost);
    
        processContext.output(genericRecord);
      }
    }
    
    TestPipeline testPipeline = TestPipeline.create();
    APICAll apiCall = Mockito.mock(APICall.class);
    dataPCollection.apply(new JsonToGenericRecordMapper(apiCall));
    

    【讨论】:

      猜你喜欢
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多