Spring Framework TEST RESTful Web Service (Controller) Offline i.e. No Server, No Database
Here is one suggestion that should give you some ideas. I assume that you are familiar with the SpringJUnit4ClassRunner
and the @ContextConfiguration
. Start by creating an test application context that contains PcUserController
and a mocked PcUserService
. In the example PcUserControllerTest
class below, Jackson is used to convert JSON messages and Mockito is used for mocking.
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(/* Insert test application context here */)public class PcUserControllerTest { MockHttpServletRequest requestMock; MockHttpServletResponse responseMock; AnnotationMethodHandlerAdapter handlerAdapter; ObjectMapper mapper; PcUser pcUser; @Autowired PcUserController pcUserController; @Autowired PcUserService pcUserServiceMock; @Before public void setUp() { requestMock = new MockHttpServletRequest(); requestMock.setContentType(MediaType.APPLICATION_JSON_VALUE); requestMock.addHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE); responseMock = new MockHttpServletResponse(); handlerAdapter = new AnnotationMethodHandlerAdapter(); HttpMessageConverter[] messageConverters = {new MappingJacksonHttpMessageConverter()}; handlerAdapter.setMessageConverters(messageConverters); mapper = new ObjectMapper(); pcUser = new PcUser(...); reset(pcUserServiceMock); }}
Now, we have all the code needed to create the tests:
@Testpublic void shouldGetUser() throws Exception { requestMock.setMethod("GET"); requestMock.setRequestURI("/pcusers/1"); when(pcUserServiceMock.read(1)).thenReturn(pcUser); handlerAdapter.handle(requestMock, responseMock, pcUserController); assertThat(responseMock.getStatus(), is(HttpStatus.SC_OK)); PcUser actualPcUser = mapper.readValue(responseMock.getContentAsString(), PcUser.class); assertThat(actualPcUser, is(pcUser));}@Testpublic void shouldCreateUser() throws Exception { requestMock.setMethod("POST"); requestMock.setRequestURI("/pcusers/create/1"); String jsonPcUser = mapper.writeValueAsString(pcUser); requestMock.setContent(jsonPcUser.getBytes()); handlerAdapter.handle(requestMock, responseMock, pcUserController); verify(pcUserServiceMock).create(pcUser);}