인프런 커뮤니티 질문&답변

Seongc좋은ᅵᅵheol Kim님의 프로필 이미지
Seongc좋은ᅵᅵheol Kim

작성한 질문수

토비의 스프링 부트 - 이해와 원리

아래와 같이 프로그램을 작성하려 하는데 에러가 나서...

해결된 질문

작성

·

256

·

수정됨

0

import static org.assertj.core.api.Assertions.assertThat;

class MyConsummer1 implements ContextConsumer {
@Override
public void accept(ApplicationContext context) throws Throwable {
assertThat(context).hasSingleBean(ConditionalTest_21.MyBean.class);
assertThat(context).hasSingleBean(ConditionalTest_21.Config1.class);
}
}

위와 같이 코딩을 해보려 하는데 hasSingleBean() 을 인식하지 못하는데 그 이유 설명 부탁드립니다.

답변 1

0

토비님의 프로필 이미지
토비
지식공유자

강의 예제에 나오는 ApplicationContextRunner로부터 시작해서 람다식으로 ContextConsumer를 만들어 넣는 방식을 쓰지 않고 위와 같이 consumer를 직접 정의하려면 스프링이 이를 확장해서 만든 타입을 명확하게 넣어줘야 합니다.

assertThat이 리턴하는 오브젝트의 타입이 hasSingleBbean()을 가지고 있게 하려면 ApplicationContext의 타입을 확장한 AssertableApplicationContext를 사용해야 합니다.

위에 만드신 코드를 다음과 같이 수정해주면 되긴할 겁니다.

class MyConsummer1 implements ContextConsumer<AssertableApplicationContext> {
    @Override
    public void accept(AssertableApplicationContext context) throws Throwable {

하지만 이런식으로 consumer를 분리하려면 타입을 꼼꼼하게 따져서 스프링이 확장한 인터페이스 타입을 직접 지정해줘야하므로 작성하기 불편합니다. 특별히 재사용을 위해서 따로 정의할 게 아니라면 강의 예제에 나오는 방식을 따라서 만드는 것을 권장합니다. IDE의 도움으로 타입이 명확하게 적용된 코드를 쉽게 작성할 수 있습니다.

ApplicationContextRunner contextRunner = new ApplicationContextRunner();
contextRunner.withUserConfiguration(Config1.class)
        .run(context -> {
            assertThat(context).hasSingleBean(MyBean.class);
            assertThat(context).hasSingleBean(Config1.class);
        });

강사님 너무 너무 감사합니다. 공부 차원에서 내부적으로 어떻게 돌아가는지 궁금해서 적용해 보고 있었습니다. 더운 여름 건강 조심하시고요

Seongc좋은ᅵᅵheol Kim님의 프로필 이미지
Seongc좋은ᅵᅵheol Kim

작성한 질문수

질문하기