복붙노트

[SPRING] 포스트 구조로 봄 콩 테스트하기

SPRING

포스트 구조로 봄 콩 테스트하기

나는 이와 비슷한 콩을 가지고있다 :

@Service
public class A {
    @Autowired
    private B b;    
    @PostConstruct
    public void setup() {
       b.call(param);
    }
}

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = { Application.class, Config.class })
@WebIntegrationTest(randomPort = true)
public class Test {
    @Autowired
    B B;
    @Before
    public void setUp() throws Exception {
        when(b.call(any())).thenReturn("smth");
    }
    @Test
    public void test() throws Exception {
        // test...
    }
}

문제는 PostConstruct가 테스트가 실행될 때 setUp 전에 호출된다는 것입니다.

해결법

  1. ==============================

    1.A의 단위 테스트를 작성하려면 Spring을 사용하지 마십시오. 대신 A를 인스턴스화하고 B의 스텁 / 모의를 전달합니다 (생성자 삽입 또는 ReflectionTestUtils을 사용하여 비공개 필드를 설정).

    A의 단위 테스트를 작성하려면 Spring을 사용하지 마십시오. 대신 A를 인스턴스화하고 B의 스텁 / 모의를 전달합니다 (생성자 삽입 또는 ReflectionTestUtils을 사용하여 비공개 필드를 설정).

    예 :

    @Service
    public class A {
    
        private final B b;    
    
        @Autowired
        public A(B b) {
            this.b = b;
        }
    
        @PostConstruct
        public void setup() {
           b.call(param);
        }
    }
    

    -

    public class Test {
    
        @Test
        public void test() throws Exception {
            B b = mock(b);
            A a = new A(b);
            // write some tests for A
        }
    
    }
    

    Spring을 사용해야 할 경우, 통합 테스트를 작성하기 위해 B를 스텁 / 모의로 대체하는 다른 애플리케이션 컨텍스트를 사용하십시오.

    예를 들어 B가 Production 클래스에서 다음과 같이 인스턴스화되었다고 가정합니다.

    @Configuration
    public class Production {
    
        @Bean
        public B b() {
            return new B();
        }
    
    }
    

    테스트를 위해 또 다른 @Configuration 클래스를 작성하십시오.

    @Configuration
    public class Tests {
    
        @Bean
        public B b() {
            // using Mockito is just an example
            B b = Mockito.mock(B.class); 
            Mockito.when(b).thenReturn("smth"); 
            return b;
        }
    
    }
    

    @SpringApplicationConfiguration 주석을 사용하여 테스트 할 때 참조하십시오.

    @SpringApplicationConfiguration(classes = { Application.class, Tests.class })
    
  2. from https://stackoverflow.com/questions/31587639/testing-spring-bean-with-post-construct by cc-by-sa and MIT license