Apache Beam,在DoFn的@Setup Lifecycle方法中初始化的模拟外部客户端



我已经创建了以下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));

您可以创建两个构造函数(一个为空,一个带有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));

最新更新