본문 바로가기

STUDY/Spring

JUnit5 | @ExtendWith, MockMvc, @TestConstructor

@ExtendWith

  • JUnit 4의 @RunWith가 JUnit 5에서는 @ExtendedWith로 변경되었음
  • @SpringBootTest애노테이션에 포함되어 있기 때문에 둘다 명시할 필요는 없음

MockMvc

  • Spring MVC 애플리케이션을 테스트 해볼 수 있게 도와줌
  • 실제 서버의 실행 없이 요청하고 응답받아볼 수 있음

MockMvcWebApplicaionContext@Autowired애노테이션을 이용해 의존관계 주입하고, setup()메서드로 MockMvc를 초기화 한다.
@BeforeEach애노테이션을 명시함으로써 테스트가 실행되기 전 setup()메서드가 실행되어 반복적으로 초기화 할 필요가 없다.

@WebMvcTest
public class HelloControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private WebbApplicationContext webApplicationContext;

    @BeforeEach
    public void setup() throws Exception{
        this.mockMvc = MockMvcBuilders
                        .webAppContextSetup(this.webApplicationContext)
                        .build();
    }

}

TestRestTemplate

  • @SpringBootTest의 WebEnvironment설정으로 실제 서버를 동작하게 한 뒤, RestTemplate을 통해 요청, 응답 받을 수 있다.
  • TestRestTemplate은 스프링에서 제공하는 테스트용 RestTemplate이다. 자동으로 내장 서버와 연결된다.
  • 필요하다면 RestTemplateBuilder를 통해 여러 설정을 추가할 수 있다.

MockMvc는 서버 사이드에서 테스트 해보는 것,
RestTemplate(TestRestTemplate)은 클라이언트 사이드에서 테스트 해보는 것 이라고 생각하면 된다.

@TestConstructor

JUnit 5부터는 생성자를 통한 의존관계 주입이 가능해졌다.
AutowireMode.ALL설정을 통해 @Autowired애노테이션을 명시하지 않고, private final로 선언된 필드들에 의존관계 주입이 가능하다.

@RequiredArgsConstructor
@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL)
@SpringBootTest
public class MyTest {

    private final HelloService helloService;

    @Test
    public void 테스트() {
        // 테스트 코드 생략
    }
}