Весеннее интеграционное тестирование Kafka со встроенным Kafka
У меня есть весеннее загрузочное приложение, которое потребляет потребителя из одной темы в одном кластере и создает другую тему в другом кластере.
Сейчас я пытаюсь написать интеграционный тестовый пример, используя Spring Kafka, но у меня возникла проблема KafkaTemplate could not be registered. A bean with that name has already been defined in class path resource
Потребительский класс
@Service
public class KafkaConsumerService {
@Autowired
private KafkaProducerService kafkaProducerService;
@KafkaListener(topics = "${kafka.producer.topic}")
public void professor(List<Professor> pro) {
pro.forEach(kafkaProducerService::produce);
}
}
Класс продюсера
@Service
public class KafkaProducerService {
@Value("${kafka.producer.topic}")
private String topic;
@Autowired
private KafkaTemplate<String, Object> kafkaTemplate;
public void produce(Professor pro) {
kafkaTemplate.send(topic,"professor",pro);
}
}
В моих тестовых случаях я хочу переопределить KafkaTemplate
так что когда я звоню kafkaConsumerService.professor
метод в Test
это должно произвести данные во встроенный Kafka, и я должен проверить это.
Тестовый конфиг
@TestConfiguration
@EmbeddedKafka(partitions = 1, controlledShutdown = false,
brokerProperties = {"listeners=PLAINTEXT://localhost:3333", "port=3333"})
public class KafkaProducerConfigTest {
@Autowired
KafkaEmbedded kafkaEmbeded;
@Autowired
KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry;
@Before
public void setUp() throws Exception {
for (MessageListenerContainer messageListenerContainer : kafkaListenerEndpointRegistry.getListenerContainers()) {
ContainerTestUtils.waitForAssignment(messageListenerContainer,
kafkaEmbeded.getPartitionsPerTopic());
}
}
@Bean
public ProducerFactory<String, Object> producerFactory() {
return new DefaultKafkaProducerFactory<>(KafkaTestUtils.producerProps(kafkaEmbeded));
}
@Bean
public KafkaTemplate<String, Object> kafkaTemplate() {
KafkaTemplate<String, Object> kafkaTemplate = new KafkaTemplate<>(producerFactory());
return kafkaTemplate;
}
}
Тестовый класс
@EnableKafka
@SpringBootTest(classes = {KafkaProducerConfigTest.class})
@RunWith(SpringRunner.class)
public class KafkaProducerServiceTest {
@Autowired
private KafkaConsumerService kafkaConsumerService;
@Test
public void testReceive() throws Exception {
kafkaConsumerService.professor(Arrays.asList(new Professor()));
//How to check messages is sent to kafka?
}
}
ошибка
The bean 'kafkaTemplate', defined in com.kafka.configuration.KafkaProducerConfigTest, could not be registered.
A bean with that name has already been defined in class path resource [com/kafka/configuration/KafkaProducerConfig.class] and overriding is disabled.
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
А также может кто-нибудь помочь мне, как проверить сообщения, отправленные на встроенный сервер Kafka?
Обратите внимание, у меня есть некоторые устаревшие предупреждения
Тип KafkaEmbedded устарел
Метод getPartitionsPerTopic() из типа KafkaEmbedded устарел
Метод generatorProps(KafkaEmbedded) типа KafkaTestUtils устарел
1 ответ
Boot 2.1 отключает переопределение bean по умолчанию.
Переопределение компонента было по умолчанию отключено, чтобы предотвратить случайное переопределение компонента. Если вы полагаетесь на переопределение, вам нужно будет установить
spring.main.allow-bean-definition-overriding
вtrue
,
Относительно амортизации; увидеть Javadocs для @EmbeddedKafka
, Заменяется EmbeddedKafkaBroker
,