如何让KafkaProducer使用模拟Schema Registry进行测试?

时间:2016-09-23 22:59:18

标签: apache-kafka confluent

我在我的测试用例中使用KafkaProducer,而我的制作人使用schemaRegistryUrl指向我的本地Schema Registry实例。有没有办法模拟KafkaProducer与Schema Registry的连接方式?也就是说,让我的测试中的KafkaProducer/Consumer在没有正在运行的Schema Registry实例的情况下工作。

2 个答案:

答案 0 :(得分:6)

绝对有。 KafkaAvroSerializer和KafkaAvroDeserializer都有一个构造函数,它接受SchemaRegistryClient。您可以使用MockSchemaRegistryClient作为SchemaRegistryClient。这是一个代码片段,展示了如何执行此操作:

private MockSchemaRegistryClient mockSchemaRegistryClient = new MockSchemaRegistryClient();
private String registryUrl = "unused";

public <T> Serde<T> getAvroSerde(boolean isKey) {
    return Serdes.serdeFrom(getSerializer(isKey), getDeserializer(isKey));
}

private <T> Serializer<T> getSerializer(boolean isKey) {
    Map<String, Object> map = new HashMap<>();
    map.put(KafkaAvroDeserializerConfig.AUTO_REGISTER_SCHEMAS, true);
    map.put(KafkaAvroDeserializerConfig.SCHEMA_REGISTRY_URL_CONFIG, registryUrl);
    Serializer<T> serializer = (Serializer) new KafkaAvroSerializer(mockSchemaRegistryClient);
    serializer.configure(map, isKey);
    return serializer;
}

private <T> Deserializer<T> getDeserializer(boolean key) {
    Map<String, Object> map = new HashMap<>();
    map.put(KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG, "true");
    map.put(KafkaAvroDeserializerConfig.SCHEMA_REGISTRY_URL_CONFIG, registryUrl);
    Deserializer<T> deserializer = (Deserializer) new KafkaAvroDeserializer(mockSchemaRegistryClient);
    deserializer.configure(map, key);
    return deserializer;
}

答案 1 :(得分:0)

Here是一个存根和嘲弄的例子,但是有了春云流。查看src / test / java / com / example / cloud / avro /文件夹。