У меня есть приложение, которое прослушивает сообщения Kafka, используя @KafkaListener
внутри @Component
. Теперь я хотел бы сделать интеграционный тест с контейнером тестирования Kafka (который раскручивает Kafka в фоновом режиме). В моем тесте я хочу убедиться, что метод слушателя был вызван и завершен, однако, когда я использую @SpyBean
в своем тесте, я получаю:
No bean found for definition [SpyDefinition@7a939c9e name = '', typeToSpy = com.demo.kafka.MessageListener, reset = AFTER]
Я использую Котлинг, важные классы:
Класс для тестирования
@Component
class MessageListener(private val someRepository: SomeRepository){
@KafkaListener
fun listen(records: List<ConsumerRecord<String, String>>) {
// do something with someRepository
}
}
Базовый тестовый класс
@ExtendWith(SpringExtension::class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class KafkaContainerTests {
// some functionality to spin up kafka testcontainer
}
Тестовый класс
class MessageListenerTest @Autowired constructor(
private val someRepository: SomeRepository
) : KafkaContainerTests() {
@SpyBean
private lateinit var messageListenerSpy: MessageListener
private var messageListenerLatch = CountDownLatch(1)
@BeforeAll
fun setupLatch() {
logger.debug("setting up latch")
doAnswer {
it.callRealMethod()
messageListenerLatch.count
}.whenever(messageListenerSpy).listen(any())
}
@Test
fun testListener(){
sendKafkaMessage(someValidKafkaMessage)
// assert that the listen method is being called & finished
assertTrue(messageListenerLatch.await(20, TimeUnit.SECONDS))
// and assert someRepository is called
}
}
Причина, по которой я запутался, заключается в том, что когда я добавляю MessageListener в конструктор @Autowired
MessageListenerTest
, он действительно успешно внедряется.
Почему тест не может найти компонент при использовании @SpyBean
?