import groovy.json.JsonSlurper import org.springframework.test.web.servlet.MockMvc import static org.springframework.test.web.servlet.setup.MockMvcBuilders.* import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.http.HttpStatus.* import spock.lang.Specification /** * A Spock Spring MVC Rest unit test that doesn't require a full spring context */ class AccountControllerTest extends Specification { def accountController = new AccountController() def securityService = Mock(SecurityService) //The magic happens here MockMvc mockMvc = standaloneSetup(accountController).build() def setup() { accountController.securityService = securityService } def "getAccount test hits the URL and parses JSON output"() { when: 'rest account url is hit' def response = mockMvc.perform(get('/rest/account')).andReturn().response def content = new JsonSlurper().parseText(response.contentAsString) then: 'securityService correctly returned account in JSON' 1 * securityService.getCurrentLogin() >> 'spockUser' //Testing the HTTP Status code response.status == OK.value() //Showing how a contains test could work response.contentType.contains('application/json') response.contentType == 'application/json;charset=UTF-8' //Can test the whole content string that is returned response.contentAsString == '{"username":"spockUser"}' //Or can use the JsonSlurper version to test the JSON as object content.username == 'spockUser' } def "simple getAccount test without spring mvc json framework"() { when: 'getAccount is called' def result = accountController.getAccount() then: 'securityService correctly returns account' 1 * securityService.getCurrentLogin() >> 'spockUser' result.username == 'spockUser' } }