Hi I have a controller called ApiController which uses a service called ApiService like so:
def createCategory(){
def jsonObj = request.JSON
jsonObj.each{ key, value ->
params.put(key,value)
}
render apiService.createCategory(params)
}
Which works fine. But I cannot seem to write a test for it.
This is how far I have got:
@TestFor(ApiController)
@Mock([Category,ApiService])
class CategorySpec extends Specification {
def setup() {
}
def cleanup() {
}
void "test"() {
setup:
def apiService = Mock(ApiService)
when:
request.method = 'POST'
request.requestMethod = 'POST'
params.categoryID = 'test'
controller.createCategory()
then:
println(response)
1==1
}
From this I get the following error:
java.lang.NullPointerException: Cannot invoke method createCategory() on null object
This is obviously because It cannot see my apiService bean. So My question is how do i do this in Spock?
It's most likely to do with the Transactional bug
: https://github.com/grails/grails-core/issues/1501
ApiService apiService = new ApiService()
controller.apiService = apiService
apiService.transactionManager = Mock(PlatformTransactionManager) { getTransaction(_) >> Mock(TransactionStatus) }
This is a temporary fix (as per the bug report comment) ... this has worked for me :)
This is how I would do it in Grails 2.4, without annotation @Mock
on the spec class:
when:
def serviceMock = mockFor(ApiService)
serviceMock.demand.createCategory { def params -> "output sample" }
controller.apiService = serviceMock.createMock()
controller.createCategory()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With