Как проверить обслуживание Grails с помощью Spock?
У меня есть EncouragementService.groovy
со следующим методом
class EncouragementService {
def stripePaymentService
def encourageUsers(List<User> users){
if(null != users && users.size()>0){
for(User user : users){
//logic
stripePaymentService.encourage(user)
//
}
}
}
}
Чтобы проверить выше код в юниверсе JAVA, используя JUnit, я бы сначала создал два или три пользователя в настройке. Передайте список пользователей методу encourageUsers(...)
и проверьте, что я хочу с результатом.
Как я могу достичь то же самое здесь, в граале,
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]
}
}
Я использую spock: 0.7
plugins {
test(":spock:0.7") { exclude "spock-grails-support" }
}
Ответы
Ответ 1
Класс обслуживания можно оптимизировать, как показано ниже:
class EncouragementService {
def encourageUsers(List<User> users){
if(users){ //Groovy truth takes care of all the checks
for(user in users){
//logic
}
}
}
}
Спок Unit Test:
Спок проводит тестирование на совершенно другом уровне, где вы можете проверить поведение (придерживается BDD). Класс тестирования будет выглядеть следующим образом:
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>
}
}
Ответ 2
Используйте плагин build-test-data для создания пользователей.
@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()]
}
}
Я также внес пару изменений в код, чтобы сделать его правильной спецификацией спока. Ваш тест должен расширить спецификацию, и вы можете ознакомиться с ключевыми словами Spock.