[java] Guice를 활용한 Java 서블릿 테스트(Mock Testing)

Guice는 자바의 의존성 주입(Dependency Injection) 프레임워크로, 테스트 코드 작성 시 모의(Mock) 객체를 사용하여 서블릿을 테스트할 수 있습니다. 이번 글에서는 Guice와 모의 객체(Mockito)를 함께 사용하여 Java 서블릿의 테스트 코드를 작성하는 방법에 대해 알아보겠습니다.

Guice 설정하기

먼저, Guice의 의존성을 프로젝트에 추가해야 합니다. Maven을 사용하는 경우, 아래와 같이 의존성을 추가할 수 있습니다.

<dependency>
    <groupId>com.google.inject</groupId>
    <artifactId>guice</artifactId>
    <version>4.2.3</version>
</dependency>

의존성을 추가했다면, Guice를 설정하는 클래스를 작성해야 합니다. 보통은 ServletContextListener를 구현한 클래스에서 Guice를 초기화합니다. 아래는 Guice 설정 예시입니다.

public class GuiceConfig extends GuiceServletContextListener {
    
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new ServletModule() {
            @Override
            protected void configureServlets() {
                bind(SampleServlet.class);
            }
        });
    }
}

위 예시에서는 SampleServlet을 Guice에 바인딩(bind)하는 설정을 하였습니다.

모의 객체(Mockito) 사용하기

테스트 코드에서 외부 의존성을 가지는 객체들을 모의(Mock) 객체로 대체하여 테스트를 진행할 수 있습니다. Mockito는 Java에서 많이 사용되는 모의 객체 라이브러리 중 하나입니다. Mockito의 의존성을 추가하기 위해 Maven을 사용한다면, 아래와 같이 의존성을 추가할 수 있습니다.

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>3.7.7</version>
    <scope>test</scope>
</dependency>

이제 Mock 객체를 사용하여 서블릿을 테스트해보겠습니다. 아래는 SampleServletdoGet() 메소드를 테스트하는 예시 코드입니다.

import static org.mockito.Mockito.*;

@RunWith(MockitoJUnitRunner.class)
public class SampleServletTest {

    @Mock
    private HttpServletRequest request;

    @Mock
    private HttpServletResponse response;

    @InjectMocks
    private SampleServlet servlet;

    @Test
    public void testDoGet() throws ServletException, IOException {
        // Mock 객체 설정
        when(request.getParameter("name")).thenReturn("John");

        // 서블릿 호출
        servlet.doGet(request, response);

        // 응답 검증
        verify(response).setStatus(HttpServletResponse.SC_OK);
        verify(response).setContentType("text/plain");
        verify(response).getWriter();
        verify(response.getWriter()).println("Hello, John!");
    }
}

위 예시 코드에서는 HttpServletRequestHttpServletResponse의 모의 객체를 생성하고, SampleServlet을 테스트하기 위해 @InjectMocks를 사용하여 servlet 변수에 주입합니다. 그리고 when()을 사용하여 모의 객체의 메소드 호출을 설정하고, verify()를 사용하여 응답을 검증합니다.

결론

Guice와 Mockito를 함께 사용하여 Java 서블릿의 테스트 코드를 작성하는 방법에 대해 알아보았습니다. Guice를 사용하면 의존성 주입을 쉽게 처리할 수 있고, Mockito를 사용하면 모의 객체를 통해 서블릿의 동작을 정확하게 테스트할 수 있습니다. 이를 통해 품질 높은 서블릿 애플리케이션을 개발할 수 있습니다.

참고 자료