Как повторно использовать класс java util в другом проекте каратэ?

#javascript #java #karate

Вопрос:

Я работал с каркасом каратэ, чтобы протестировать свою службу отдыха, и она отлично работает, однако у меня есть служба, которая использует сообщение из темы кафки, а затем сохраняется на монго, чтобы, наконец, уведомить кафку. Я создал java-продюсера в своем проекте каратэ, он называется js для использования функцией. Затем у меня есть потребитель, чтобы проверить сообщение

Особенность:

     * def kafkaProducer = read('../js/KafkaProducer.js')
 

JS:

 function(kafkaConfiguration){
var Producer = Java.type('x.y.core.producer.Producer');
var producer = new Producer(kafkaConfiguration);
return producer;
}
 

Ява:

 public class Producer {

private static final Logger LOGGER = LoggerFactory.getLogger(Producer.class);

private static final String KEY = "C636E8E238FD7AF97E2E500F8C6F0F4C";
private KafkaConfiguration kafkaConfiguration;
private ObjectMapper mapper;
private AESEncrypter aesEncrypter;


public Producer(KafkaConfiguration kafkaConfiguration) {
    kafkaConfiguration.getProperties().put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
    kafkaConfiguration.getProperties().put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.ByteArraySerializer");
    this.kafkaConfiguration = kafkaConfiguration;
    this.mapper = new ObjectMapper();
    this.aesEncrypter = new AESEncrypter(KEY);
}


public String produceMessage(String payload) {

  // Just notify kafka with payload and return id of payload
}
 

Другой класс

 public class KafkaConfiguration {

private static final Logger LOGGER = LoggerFactory.getLogger(KafkaConfiguration.class);

private Properties properties;

public KafkaConfiguration(String host) {

    try {
        properties = new Properties();
        properties.put(BOOTSTRAP_SERVERS_CONFIG, host);
        properties.put(ConsumerConfig.GROUP_ID_CONFIG, "karate-integration-test");
        properties.put(ConsumerConfig.CLIENT_ID_CONFIG, "offset123");
        properties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true);
        properties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
    } catch (Exception e) {
        LOGGER.error("Fail creating the consumer...", e);
        throw e;
    }
}

public Properties getProperties() {
    return properties;
}

public void setProperties(Properties properties) {
    this.properties = properties;
}
}
 

Я бы хотел использовать код производителя с таким выражением, как огурец, например:

 @Then("^Notify kafka with payload (-?\d )$")
    public void validateResult(String payload) throws Throwable {
        new Producer(kafkaConfiguration).produceMessage(payload);
    }
 

и об использовании функций

 Then Notify kafka with payload "{example:value}"
 

Я хочу это сделать, потому что хочу повторно использовать этот код в базовом проекте, чтобы его можно было включить в другой проект
Если аннотация не работает, может быть, вы можете предложить мне другой способ сделать это

Ответ №1:

Ответ прост, используйте обычные концепции Java / Maven. Переместите общий код Java в «основные» пакеты ( src/main/java ). Теперь все, что вам нужно сделать, это создать банку и добавить ее в качестве зависимости в любой проект Каратэ.

Последняя часть головоломки заключается в следующем: используйте classpath: префикс для обозначения любых функций или файлов JS в банке. Каратэ сможет их подобрать.

ПРАВКА: Извините, Каратэ не поддерживает определения огурцов или шагов. У него гораздо более простой подход. Пожалуйста, прочтите это для получения дополнительной информации: https://github.com/intuit/karate/issues/398

Комментарии:

1. Итак, могу ли я создать базовый проект с аннотацией корнишона и использовать его в другом проекте?

2. @TuGordoBello извините, я только сейчас заметил, что в вашем ответе была «аннотация корнишона», вот почему вы должны задавать простые и краткие вопросы. Я отредактировал свой ответ, см. Конец. Извините, Каратэ-ЭТО НЕ Огурец, пожалуйста, не пытайтесь его форсировать 🙂