2014-09-19 2 views
5

내가 만들고있는 스프링 REST 웹 서비스에 대해 JUnit 및 Mockito로 테스트를 실행하려고합니다. JUnit 테스트를 실행할 때 버그를 발견 했으므로 문제에 대한 정보를 찾을 수 없습니다. 당신을 사용하는java.lang.NoSuchMethodError : javaxservlet.http.HttpServletRequest.isAsyncStarted() Z

java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted()Z 
at org.springframework.test.web.servlet.result.PrintingResultHandler.printAsyncResult(PrintingResultHandler.java:131) 
at org.springframework.test.web.servlet.result.PrintingResultHandler.handle(PrintingResultHandler.java:80) 
at org.springframework.test.web.servlet.MockMvc$1.andDo(MockMvc.java:155) 
at org.company.test.TestSuite.testREST(TestSuite.java:53)` 
+0

가능한 [용액 (http://stackoverflow.com/questions/23759690/java-lang-nosuchmethoderror-javax-servlet-http- httpservletrequest-isasyncstarte) – Grice

답변

7

:

public class TestSuite { 
    MockMvc mockMvc; 

@Mock 
RestController controller; 

@Before 
public void setup(){ 
    MockitoAnnotations.initMocks(this); 
    this.mockMvc = standaloneSetup(controller) 
     .setMessageConverters(new MappingJackson2HttpMessageConverter()).build(); 
} 

@Test 
public void testREST() throws Exception { 
    when(controller.getThing(any(Integer.class))).thenReturn(TestFixture.getREST(1)); 
    this.mockMvc.perform(get("/{number}", String.valueOf(number)) 
    .accept(MediaType.APPLICATION_JSON)) 
    .andDo(print()) 
    .andExpect(status().isNotFound()); 
}} 

스택 트레이스 : 나는 spring.io 튜토리얼 http://spring.io/guides/tutorials/rest/3/

테스트 클래스 코드에서 직접 그 라인을받은 .andDo(print()) 것처럼 스택 트레이스는 오류 라인을 나열한다 Servlet 사양의 이전 버전 (예 : 2.5). 반면에 사용중인 spring-test 버전에는 최소한 Servlet 3.0이 필요합니다.

참조 매뉴얼의 Testing Improvements 절에서 설명한 바와 같이

,

As of Spring 4.0, the set of mocks in the org.springframework.mock.web package is now based on the Servlet 3.0 API.

따라서 스프링 프레임 워크 비록 4.0 4.1 지원 배치 서블릿 API의 모의 객체와 스프링 MVC 테스트 워크위한 서블릿 2.5 spring-test 모듈에서는 Servlet 3.0 (특히 버전 3.0.1 이상)이 필요합니다.

감사

샘합니다 (spring-test 모듈의 리드)

+0

동일한 시나리오를 겪고있는 앱이 있습니다. 앱을 배포하기 위해 필요한 컨테이너는 Servlet 2.5 만 가능합니다. 최소 단위 테스트를 위해 스프링 테스트를 2.5와 함께 작동시키는 방법이 있습니까? – user6123723

+0

아니요, 서블릿 2.5로 '스프링 테스트'에서 모의 ​​서블릿 API를 사용할 수 없습니다. 그러나 프로덕션 코드 (예 : 컨트롤러)의 Servlet 3.x 기능에 의존하지 않는 한 Servlet 2.5에 대해 배포하는 동안 Servlet 3.x에 대한 테스트에는 아무런 문제가 없습니다. –