카프카 의존성을 추가하고 나서 JUnit 테스트가 작동하지 않았다. Brokers may not be available
과 같은 에러 메시지를 계속 뱉으면서 무한루프를 돌고 있었다.
@EnableBinding(Sink.class)
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@StreamListener(Sink.INPUT)
public void logSinkMessage(DiaryChangeModel diaryChange) {
...
}
}
@SpringBootApplication
을 부착한 클래스에 카프카 어노테이션을 부착한 상태이다.
@Service
public class Serivce {
private final Repository repo;
private final KafkaSourceBean kafka;
...
}
서비스에는 특정 카프카 처리를 위한 빈이 주입된다.
@Component
public class KafkaSourceBean {
private final Source source;
...
}
@Component
이기 때문에 @SpringBootTest
기동 시, 컴포넌트 스캔에 의해 자동 생성된다.
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@TestPropertySource(locations = "/application-test.properties")
@DirtiesContext(classMode = BEFORE_EACH_TEST_METHOD)
public class SaveTest {
...
}
@SpringBootTest(classes = Application.class)
이기 때문에 Application.class를 기준으로 하위 패키지들이 전부 컴포넌트 스캔
된다. 그에 따라 테스트 환경에 필요 없는 카프카 빈들도 자동 주입되고 말았다.
그래서 테스트 환경 (또는 프로파일)일 경우에는 카프카 의존성을 주입하지 않도록 조정할 필요가 있겠다.
@EnableAutoConfiguration(exclude = {KafkaAutoConfiguration.class})
를 테스트 클래스에 부착한다.public class KafkaSourceBean {
private final Source source;
}
@EnableBinding(Source.class)
@ConditionalOnProperty(value = "kafka.enabled", matchIfMissing = true)
@Configuration
public class KafkaConfiguration {
@Autowired
private Source source;
@Bean
public KafkaSourceBean kafkaSourceBean() {
return new KafkaSourceBean(source);
}
}
여기서 중요한 것은 @ConditionalOnProperty(value = "kafka.enabled", matchIfMissing = true)
이다.
properties나 yml 파일에 kafka.enabled
가 true여야만 위 설정 클래스가 빈으로 로딩된다.
즉, 테스트용 properties에는 false로 작성하면 빈으로 등록되지 않을 것이다.
kafka.enabled=false
참고로, "false"가 아니라 false다.
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DiaryServiceApplication.class)
@TestPropertySource(locations = "/application-test.properties")
public class SaveDiaryControllerTest {
@Autowired
private Service service;
@MockBean
private KafkaSourceBean kafka;
}
먼저, @TestPropertySource(locations = "/application-test.properties")
를 이용해서 테스트 시에만 사용되는 properties를 지정하자.
아니면 Spring Profile 기능을 활용하여 분리해도 된다.
그리고 @MockBean
으로 서비스에서 빠져버린 카프카 의존성을 가짜로 대체해주자.
https://velog.io/@roycewon/Component-Scan%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC
https://velog.io/@leejisoo/SpringBootTest-%EC%A0%95%EB%A6%AC
https://oingdaddy.tistory.com/476
https://stackoverflow.com/questions/58448677/how-to-disable-enablekafka-in-spring-boot-tests