[SPRING] 유닛 테스트를위한 객체 MockHttpServletResponse 생성 오류
SPRING유닛 테스트를위한 객체 MockHttpServletResponse 생성 오류
아래의 책처럼 자바 서블릿을 테스트하고 싶습니다. 실용적인 TDD 및 수락 TDD 자바 개발자 :
package sample;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
private boolean isValid;
/**
*
*/
private static final long serialVersionUID = 2473252741884321641L;
@Override
public void init() throws ServletException {
super.init();
}
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
String user = req.getParameter("j_username");
String pass = req.getParameter("j_password");
if (isValidLogin(user, pass)) {
resp.sendRedirect("/frontpage");
req.getSession().setAttribute("username", user);
} else {
resp.sendRedirect("/invalidlogin");
}
}
private boolean isValidLogin(String user, String pass) {
return isValid;
}
public void setValid(boolean isValid) {
this.isValid = isValid;
}
}
내 코드는 다음과 같습니다.
package sample;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
public class SprintTestProb {
@Test
public void wrongPasswordShouldRedirectToErrorPage() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
request.addParameter("j_username", "gyanu");
request.addParameter("j_password", "wrongpassword");
LoginServlet login = new LoginServlet();
login.setValid(false);
login.doPost(request, response);
assertEquals("/invalidlogin", response.getRedirectedUrl());
}
}
나는 라인에 오류가있다. MockHttpServletResponse response = new MockHttpServletResponse (); 다음과 같이
java.lang.ExceptionInInitializerError
at org.springframework.mock.web.MockHttpServletResponse.<init>(MockHttpServletResponse.java:76)
at sample.SprintTestProb.wrongPasswordShouldRedirectToErrorPage(SprintTestProb.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.util.MissingResourceException: Can't find bundle for base name javax.servlet.LocalStrings, locale en_US
at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1499)
at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1322)
at java.util.ResourceBundle.getBundle(ResourceBundle.java:721)
at javax.servlet.ServletOutputStream.<clinit>(ServletOutputStream.java:87)
... 25 more
해결법
-
==============================
1.javaee-api의 의존성을 javax.selvlet-api로 대체해야한다.
javaee-api의 의존성을 javax.selvlet-api로 대체해야한다.
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency>
-
==============================
2.테스트 용 스프링 프레임 워크 레퍼런스 (Spring Framework Reference for Testing)에 따르면, 당신은 모의를 autowire하기 위해 어노테이션을 사용해야 만합니다. 스프링 참조의 예 :
테스트 용 스프링 프레임 워크 레퍼런스 (Spring Framework Reference for Testing)에 따르면, 당신은 모의를 autowire하기 위해 어노테이션을 사용해야 만합니다. 스프링 참조의 예 :
`
@WebAppConfiguration @ContextConfiguration public class WacTests { @Autowired WebApplicationContext wac; // cached @Autowired MockServletContext servletContext; // cached @Autowired MockHttpSession session; @Autowired MockHttpServletRequest request; @Autowired MockHttpServletResponse response; @Autowired ServletWebRequest webRequest; //... }
`
다른 예 (주석 없음)는 여기에서 찾을 수 있습니다.
-
==============================
3.비슷한 문제가있어서이 종속성을 내 pom에 추가하여 javaee-api를 javax.servlet로 변경할 필요가 없습니다.
비슷한 문제가있어서이 종속성을 내 pom에 추가하여 javaee-api를 javax.servlet로 변경할 필요가 없습니다.
<dependency> <groupId>org.mortbay.jetty</groupId> <artifactId>servlet-api-2.5</artifactId> <version>6.1.11</version> </dependency>
from https://stackoverflow.com/questions/23386234/error-creating-object-mockhttpservletresponse-for-unit-testing by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] EnableWebSecurity를 사용할 때 AuthenticationPrincipal이 비어 있습니다. (0) | 2019.04.22 |
---|---|
[SPRING] 단계별 스프링 배치 흐름 / 분할 (0) | 2019.04.22 |
[SPRING] Spring jdbcTemplate과 PreparedStatementSetter를 사용하여 생성 된 컬럼 id 값을 반환하는 방법을 모르고있다. (0) | 2019.04.22 |
[SPRING] CreateQuery가 활성 트랜잭션없이 유효하지 않습니다. (0) | 2019.04.22 |
[SPRING] 상속 된 클래스의 봄 MVC 유효성 검사 (0) | 2019.04.22 |