I have a EncouragementService.groovy
with following method
class EncouragementService {
def stripePaymentService
def encourageUsers(List<User> users){
if(null != users && users.size()>0){
for(User user : users){
//logic
stripePaymentService.encourage(user)
//
}
}
}
}
To test above code in JAVA universe, using JUnit I would first create two or three users in setup. Pass the list of users to encourageUsers(...)
method and check whatever I want with the result.
How can I achieve the same thing here in grails,
import com.github.jmkgreen.morphia.Datastore;
@TestFor(EncouragementService)
class EncouragementServiceSpec {
def morphiaService = new MorphiaService()
void testEncourageUsers() {
List<User> users = createUsers();
encouragementService.(users)
//
}
def createUsers(){
Datastore datastore = morphiaService.dataStoreInstance()
def user = new User()
user.setName("Prayag Upd")
//
datastore.save(user)
[user]
}
}
I am using spock:0.7
plugins {
test(":spock:0.7") { exclude "spock-grails-support" }
}
Service class can be optimized as below:
class EncouragementService {
def encourageUsers(List<User> users){
if(users){ //Groovy truth takes care of all the checks
for(user in users){
//logic
}
}
}
}
Spock Unit Test:
Spock takes testing to whole another level, where you can test the behavior (adheres to BDD). The test class would look like:
import spock.lang.*
@TestFor(EncouragementService)
@Mock(User) //If you are accessing User domain object.
class EncouragementServiceSpec extends Specification{
//def encouragementService //DO NOT NEED: mocked in @TestFor annotation
void "test Encourage Users are properly handled"() {
given: "List of Users"
List<User> users = createUsers()
when: "service is called"
//"service" represents the grails service you are testing for
service.encourageUsers(users)
then: "Expect something to happen"
//Assertion goes here
}
private def createUsers(){
return users //List<User>
}
}
Use the build-test-data plugin to build the users.
@TestFor(EncouragementService)
@Build(User)
class EncouragementServiceSpec extends Specification {
def "encourage users does x"() {
given:
def users = createUsers();
when:
service.encourageUsers(users)
then:
// assert something
}
def createUsers(){
[User.build(), User.build(), User.build()]
}
}
I've also made a couple of changes to the code to make it a proper spock specification. Your test has to extend Specification and you might want to familiarize yourself with Spock's keywords.
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