Skip to content

Instantly share code, notes, and snippets.

@jeffsheets
Created June 20, 2014 20:18
Show Gist options
  • Star 30 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save jeffsheets/ada3de8fe4a536e5351b to your computer and use it in GitHub Desktop.
Save jeffsheets/ada3de8fe4a536e5351b to your computer and use it in GitHub Desktop.
Spock test with Mocks of Spring MVC Rest Controller using standaloneSetup and mockMvc
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'
}
}
@Jason-Terry
Copy link

I did figure it out. It was not a request parameter we were using, just confusingly handling authentication.

Now I am battling IntelliJ and its autocomplete. I can't get my code to behave when using JSON-slurper...

Code compiles, test runs and passes, but IDE doesn't understand content.response.results[0].last4 == 1234

Seems not to know what the methods are.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment