이번 포스트에서는 JUnit과 Mock을 기반으로 스프링에서 단위 테스트를 하는 방법에 대해 정리해보겠습니다.
Mock
가장 먼저 Mock에 대해 알아보겠습니다. Mock은 테스트를 위한 가짜 객체를 말합니다. 테스트를 할 때 객체가 필요하면 객체를 만들어야하는데 실제 객체를 만들기 위해서는 비용/시간/의존성문제가 걸쳐져 있습니다. 때문에 실제 객체를 구현하기 어려울 경우 Mock이라는 가짜 객체를 이용하여 테스트를 진행합니다.
Mokito
Mokito는 개발자가 동작을 직접 제어할 수 있는 가짜 객체를 지원하는 테스트 프레임워크입니다.
[스프링 객체 의존도 그림]
[Mock 객체를 이용한 단위 테스트]
보통 스프링으로 웹 어플리케이션을 개발하면 여러 객체들의 의존성이 생기는데, 이러한 의존성은 단위 테스트를 작성하기 어렵게 만듭니다. Mokito에서는 가짜 객체를 주입시켜 이러한 의존성 문제를 해결 할 수 있는 라이브러리를 제공합니다. 즉, Mokito를 이용하면 가짜 객체(Mock)에 원하는 결과를 임의로 작성하여 단위 테스트를 진행할 수 있습니다. 하지만 가짜 객체(Mock)를 이용하지 않아도 테스트를 진행할 수 있다면 만들지 않는 것이 좋습니다.
JUnit
JUnit이란 자바 프로그래밍 언어용 유닛 테스트 프레임워크입니다.
테스트 결과는 Test클래스로 개발자에게 테스트 방법 및 클래스 History를 공유할 수 있습니다.
assert 메소드로 테스트 케이스의 수행 결과를 판별하며 어노테이션을 이용하여 간편하게 사용할 수 있습니다.
Mockito+JUnit
Mockito도 테스팅 프레임워크이기 때문에 JUnit과 결합하기 위해서 다음과 같은 작업이 필요합니다.
Mokito 사용법
만약 MemberController에 대한 단위 테스트를 진행하고자 할 때, MemberService를 가지고 있다면 @Mock 어노테이션을 통해 가짜 MemberService를 만듭니다. 그리고 @InjectMock를 통해 MemberController에 주입 합니다.
@RunWith(MockitoJUnitRunner.class) // JUnit4에서 Mockito를 활용하기 위한 어노테이션
public class LoginRestControllerMockito {
@InjectMocks
private LoginRestController loginRestController;
@Mock
private MemberService memberService;
private MockMvc mockMvc; // request 수행해주는 mock 객체
@Before
public void before() {
mockMvc = MockMvcBuilders.standaloneSetup(loginRestController).build();
}
@DisplayName("로그인 테스트")
@Test
public void 로그인_테스트() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.post("/login")
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.param("uId", "a")
.param("uPw", "a12345"))
.andExpect(status().isBadRequest())
.andDo(print());
}
}
Spring에서 MockMVC
MockMVC는 스프링에서 MVC테스트를 하기 위한 방법을 논의하여 스프링 테스트 모듈을 스프링 프레임워크에 더한 것으로, 이미 스프링에서 관리하고 있는 빈을 @Autowired받아 스프링 컨텍스트 환경으로 테스트할 수 있게 도와주는 라이브러리 입니다.
@RunWith(SpringJunit4ClassRunner.class) // SpringJunit4ClassRunner.class는 spring-test에서 제공하는 단위테스트를 위한 클래스 러너
@ContextConfiguration(classes = {WebAppConfig.class, DispatcherServletConfig.class})
@WebAppConfiguration // WebApplicationContext 생성할 수 있도록 하는 어노테이션
public class LoginRestControllerTest {
@Autowired
private WebApplicationContext webApplicationContext;
@Autowired
private MemberDAO memberDAO;
private MockMvc mockMvc; // request 수행해주는 mock 객체
...
}
MockMVC에는 다양한 메소드가 존재합니다.
forwardedUrlPattern()
사용redirectedUrlPattern()
사용