SlideShare uma empresa Scribd logo
Spock Framework Parte 1 Ismael Soares
Spock é um  framework   de testes  para aplicações  Java e Groovy.
Diferenciais JUnit Código bonito Fácil de aprender Altamente expressivo  Utiliza recursos da linguagem Groovy
Quem Usa? Gradle Grails + + +
import  spock . lang .* class   HelloSpock   extends  spock . lang . Specification   {      def   "length of Spock's and his friends' names" ()   {         expect :         name . size ()   ==  length          where :         name      |  length          "Spock“   |   5          "Kirk"     |   4          "Scotty"   |   6      } }                     Exemplo
// Executado antes de cada método def  setup ()   {}            // Executado depois de cada método  def  cleanup ()   {}          // Executado antes do primeiro método def  setupSpec ()   {}       // Executado após o último método def  cleanupSpec ()   {}     Ciclo de vida
Configura os recursos necessários para o teste. Proporciona o estímulo para o teste Descreve as respostas esperadas Limpa os recursos utilizados no teste. Fases
Blocos e fases
setup/given:  // criar fixtures  when :     // estímulos then && and :     // respostas cleanup:  // limpar fixtures   Fases
when :”incluir um elemento na pilha” pilha . push ( elemento ) then :”ela não pode ficar vazia” ! pilha . empty pilha . size ()   ==   1   and :”deve conter o elemento incluído” pilha . peek ()   ==  elemento Exemplo
Condition   not  satisfied : pilha . size ()   ==   2 |       |        |     |       1        false [ push me ] Resultado
when :”retirar os elementos de pilha vazia” pilha . pop () then :”deve retornar Exception” def e = thrown ( EmptyStackException ) e.message == ‘bla’ stack . empty Exception
def   "HashMap accepts null key" ()   {   given :“um mapa”    def  map  =   new   HashMap ()       when :”incluir um elemento com a chave null”   map . put ( null ,   "elem" )       then :”não deve retornar exception”   notThrown ( NullPointerException ) } Exception
def   "events are published to all subscribers" ()   {      setup :   def  subscriber1  =   Mock ( Subscriber )    def  subscriber2  =   Mock ( Subscriber )    def  publisher  =   new   Publisher ()   publisher . add ( subscriber1 )   publisher . add ( subscriber2 )       when :   publisher . fire ( "event" )       then :     1 *  subscriber1 . receive ( "event" )    1   *  subscriber2 . receive ( "event" ) //Alternativa (qualquer mock) 2 * _. receive ( "event" ) } Interações
// Global setup : subscriber . isAlive ()   >>   true // Local when :  publisher . send ( event ) then :   1   *  subscriber . receive ( event ) //Válido para o que está acima //Opicional then :  subscriber . isAlive ()   >>   true //Obrigatório then :   1   *  subscriber . isAlive ()   >>   true then :  n  *  subscriber . receive ( event ) //Cardinalidades n  *  subscriber . receive ( event )        // exatamente n vezes ( n .. _ )   *  subscriber . receive ( event )   // as vezes pelo menos n vezes ( _ .. n )   *  subscriber . receive ( event )   // no máximo n vezes //Regex subscriber ./ set .*/( _ )   // qualquer setter que for chamado do subscriber  Interações
// sem argumentos  subscriber . receive ()                // qualquer argumento subscriber . receive ( _ )                     // qualquer argumento não nulo  subscriber . receive (! null )                  // argumento específico subscriber . receive ( event )                 // qualquer argumento diferente do específico  subscriber . receive (! event )                 // qualquer argumento do tipo Message (não nulo) subscriber . receive ( _  as   Message ) // constraint customizada           subscriber . receive (   {  it . priority  >=   5   }   )   Restrições de Argumentos
Para métodos que usam vários argumentos // qualquer três argumentos  mock . foo ( _ ,  _ ,  _ )                      // qualquer argumento no primeiro, não nulo no segundo e no terceiro, uma regex mock . foo ( _ ,   ! null ,   {  it  ==~   / a * b /   })   // restrições para varargs podem ser especificadas em estilo de lista ou estilo vararg: def foo(String... args) // estilo lista  mock . foo ([ "one" ,   "two" ])   // estilo vararg mock . foo ( "one" ,   "two" )   
Na próxima apresentação... Valores de retorno Verificações ordenadas Bloco Expect Bloco Cleanup Bloco Where Métodos Helper Spock Vs JUnit
Referência http://code.google.com/p/spock/
Obrigado

Mais conteúdo relacionado

PPT
Spock Framework 2
Ismael
 
PDF
PHP fora da Web
Vinícius Campitelli
 
PPT
PowerShell
Wellington Oliveira
 
PDF
Node.js - #5 - Process - Rodrigo Branas
Rodrigo Branas
 
PDF
Node.js - #4 - Timers - Rodrigo Branas
Rodrigo Branas
 
PDF
Threads 10: CompletableFuture
Helder da Rocha
 
PDF
Curso de Java: Threads
Helder da Rocha
 
PDF
Threads 04 Variáveis atômicas
Helder da Rocha
 
Spock Framework 2
Ismael
 
PHP fora da Web
Vinícius Campitelli
 
Node.js - #5 - Process - Rodrigo Branas
Rodrigo Branas
 
Node.js - #4 - Timers - Rodrigo Branas
Rodrigo Branas
 
Threads 10: CompletableFuture
Helder da Rocha
 
Curso de Java: Threads
Helder da Rocha
 
Threads 04 Variáveis atômicas
Helder da Rocha
 

Mais procurados (20)

PDF
A Classe StringBuilder em Java
Devmedia
 
PDF
Doctrine2 Seminário PHP
Guilherme Blanco
 
PDF
Threads 07: Sincronizadores
Helder da Rocha
 
PDF
Node.js - #3 - Global Objects - Rodrigo Branas
Rodrigo Branas
 
ODP
servlet-respostas
Fábio Nogueira de Lucena
 
PPT
Spring Capitulo 03
Diego Pacheco
 
PDF
Threads 09: Paralelismo
Helder da Rocha
 
PDF
Threads 06: Coleções concorrentes
Helder da Rocha
 
PDF
JavaScript - De verdade
Luis Vendrame
 
PDF
Curso de Java: Introdução a lambda e Streams
Helder da Rocha
 
PDF
Threads 08: Executores e Futures
Helder da Rocha
 
PDF
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Rodrigo Branas
 
PPT
Mobileconf dicas-android
Alberto Souza
 
PPTX
Javascript
Fernando Simeone
 
PDF
Threads 05: Travas de Exclusão Mútua
Helder da Rocha
 
PDF
Gems para colocar seus testes no trilho
Webgoal
 
PDF
Threads 01: Criação e controle de threads
Helder da Rocha
 
PDF
Atualização Java 8 (2014)
Helder da Rocha
 
KEY
Introdução ao Framework Grails
Bruno Catão
 
PDF
Golang para desenvolvedores pragmáticos parte 2
Wilson Júnior
 
A Classe StringBuilder em Java
Devmedia
 
Doctrine2 Seminário PHP
Guilherme Blanco
 
Threads 07: Sincronizadores
Helder da Rocha
 
Node.js - #3 - Global Objects - Rodrigo Branas
Rodrigo Branas
 
servlet-respostas
Fábio Nogueira de Lucena
 
Spring Capitulo 03
Diego Pacheco
 
Threads 09: Paralelismo
Helder da Rocha
 
Threads 06: Coleções concorrentes
Helder da Rocha
 
JavaScript - De verdade
Luis Vendrame
 
Curso de Java: Introdução a lambda e Streams
Helder da Rocha
 
Threads 08: Executores e Futures
Helder da Rocha
 
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Rodrigo Branas
 
Mobileconf dicas-android
Alberto Souza
 
Javascript
Fernando Simeone
 
Threads 05: Travas de Exclusão Mútua
Helder da Rocha
 
Gems para colocar seus testes no trilho
Webgoal
 
Threads 01: Criação e controle de threads
Helder da Rocha
 
Atualização Java 8 (2014)
Helder da Rocha
 
Introdução ao Framework Grails
Bruno Catão
 
Golang para desenvolvedores pragmáticos parte 2
Wilson Júnior
 
Anúncio

Destaque (20)

KEY
Androidリリース作業の効率化(2)
Kenichi Kambara
 
PDF
Grails/Groovyによる開発事例紹介
Kiyotaka Oku
 
ODP
Jenkins導入ライブ
Hiasyoshi Suehiro
 
PDF
Hands on the Gradle
Matthias Käppler
 
PDF
Jenkinsプラグインの作り方
Kiyotaka Oku
 
PDF
How about Gradle?
Yasuharu Nakano
 
PPT
Jenkinsプラグイン開発
Takahisa Wada
 
PDF
Gradle a new Generation Build Tool
Shinya Mochida
 
PDF
Testing Web Applications with GEB
Howard Lewis Ship
 
ZIP
Groovy and Grails in Action - Devoxx 2008 - University - Guillaume Laforge
Guillaume Laforge
 
KEY
function list
kyon mm
 
PDF
レガシーコード改善はじめました 横浜道場
Hiroyuki Ohnaka
 
PDF
Spock: A Highly Logical Way To Test
Howard Lewis Ship
 
PDF
GradleによるG*なビルドシステムの構築
Masatoshi Hayashi
 
PDF
Jenkinsを用いたAndroidアプリビルド作業効率化
Kenichi Kambara
 
PDF
Groovy Testing Aug2009
guest4a266c
 
PDF
AgileJapan2010 基調講演:野中郁次郎先生による「実践知のリーダシップ~スクラムと知の場作り」
Kenji Hiranabe
 
KEY
The outlineoftestprocess
kyon mm
 
PDF
Spockを使おう!
Takuma Watabiki
 
PDF
Gradle talk, Javarsovia 2010
Tomek Kaczanowski
 
Androidリリース作業の効率化(2)
Kenichi Kambara
 
Grails/Groovyによる開発事例紹介
Kiyotaka Oku
 
Jenkins導入ライブ
Hiasyoshi Suehiro
 
Hands on the Gradle
Matthias Käppler
 
Jenkinsプラグインの作り方
Kiyotaka Oku
 
How about Gradle?
Yasuharu Nakano
 
Jenkinsプラグイン開発
Takahisa Wada
 
Gradle a new Generation Build Tool
Shinya Mochida
 
Testing Web Applications with GEB
Howard Lewis Ship
 
Groovy and Grails in Action - Devoxx 2008 - University - Guillaume Laforge
Guillaume Laforge
 
function list
kyon mm
 
レガシーコード改善はじめました 横浜道場
Hiroyuki Ohnaka
 
Spock: A Highly Logical Way To Test
Howard Lewis Ship
 
GradleによるG*なビルドシステムの構築
Masatoshi Hayashi
 
Jenkinsを用いたAndroidアプリビルド作業効率化
Kenichi Kambara
 
Groovy Testing Aug2009
guest4a266c
 
AgileJapan2010 基調講演:野中郁次郎先生による「実践知のリーダシップ~スクラムと知の場作り」
Kenji Hiranabe
 
The outlineoftestprocess
kyon mm
 
Spockを使おう!
Takuma Watabiki
 
Gradle talk, Javarsovia 2010
Tomek Kaczanowski
 
Anúncio

Semelhante a Spock Framework (20)

PPT
Aula5
fkimura
 
PPT
OOP ObjC
Jorge Cardoso
 
PPT
Aop Aspect J 1.5.4 Capitulo 04
Diego Pacheco
 
PPTX
Javascript avançado
Ricardo Cavalcanti
 
PDF
Aprendendo objective c - parte 1
Alamo Saravali
 
PPTX
ESTRUTURA DE DADOS (JAVA) AULA 09
ETEC Monsenhor Antonio Magliano
 
PPTX
Threads e Estruturas de dados
DouglasSoaresAndrSch
 
PDF
Algoritmos de ordenação
Lorival Smolski Chapuis
 
PDF
Turbinando o desenvolvimento Android com Kotlin
Nelson Glauber Leal
 
PPTX
Javascript para CSharpers 2 - Functions
Wesley Lemos
 
PDF
LabMM3 - Aula teórica 09
Carlos Santos
 
PDF
Refatoração de código com Capitão Nascimento versão completa
Eduardo Bregaida
 
PPTX
Design patterns
DouglasSoaresAndrSch
 
PDF
JS Experience 2017 - Javascript Funcional
iMasters
 
PPT
4º Aula do Grupo de estudos sobre funções
Fellyph Cintra
 
PDF
Evento Front End SP - Organizando o Javascript
Michel Ribeiro
 
PPTX
Java hidden features
Josenaldo de Oliveira Matos Filho
 
PDF
Introdução a JavaScript
Bruno Catão
 
PDF
Leonardo Zamariola - High Order Functions e Functional Interfaces
DevCamp Campinas
 
PDF
Introdução à programação em Android e iOS - OOP em ObjC
Luís Gustavo Martins
 
Aula5
fkimura
 
OOP ObjC
Jorge Cardoso
 
Aop Aspect J 1.5.4 Capitulo 04
Diego Pacheco
 
Javascript avançado
Ricardo Cavalcanti
 
Aprendendo objective c - parte 1
Alamo Saravali
 
ESTRUTURA DE DADOS (JAVA) AULA 09
ETEC Monsenhor Antonio Magliano
 
Threads e Estruturas de dados
DouglasSoaresAndrSch
 
Algoritmos de ordenação
Lorival Smolski Chapuis
 
Turbinando o desenvolvimento Android com Kotlin
Nelson Glauber Leal
 
Javascript para CSharpers 2 - Functions
Wesley Lemos
 
LabMM3 - Aula teórica 09
Carlos Santos
 
Refatoração de código com Capitão Nascimento versão completa
Eduardo Bregaida
 
Design patterns
DouglasSoaresAndrSch
 
JS Experience 2017 - Javascript Funcional
iMasters
 
4º Aula do Grupo de estudos sobre funções
Fellyph Cintra
 
Evento Front End SP - Organizando o Javascript
Michel Ribeiro
 
Java hidden features
Josenaldo de Oliveira Matos Filho
 
Introdução a JavaScript
Bruno Catão
 
Leonardo Zamariola - High Order Functions e Functional Interfaces
DevCamp Campinas
 
Introdução à programação em Android e iOS - OOP em ObjC
Luís Gustavo Martins
 

Mais de Ismael (20)

PDF
TDC 2020 - Trilha de Management 3.0 e Gestão Ágil
Ismael
 
PDF
Introducao ao Pensamento Sistemico
Ismael
 
PDF
Testes de unidade alem do basico
Ismael
 
PDF
Bluesoft Culture
Ismael
 
PDF
Como dar e receber feedbacks
Ismael
 
PDF
Eficiencia de fluxo
Ismael
 
PDF
Como você testa seu software TDC 2017
Ismael
 
PDF
Como ter Entregas Frequentes
Ismael
 
PDF
JUnit 5 vs JUnit 4
Ismael
 
PDF
Conceitos por trás do Ágil
Ismael
 
PDF
Boas Praticas de Testes, Bad Smell e Outros Macetes
Ismael
 
PDF
8 passos para mudança de John Kotter
Ismael
 
PDF
Curva da Mudança Kubler-Ross
Ismael
 
PDF
DevCamp 2016
Ismael
 
PDF
7 Caracteristicas de um bom Lider Agil
Ismael
 
PDF
Law of demeter
Ismael
 
PDF
Junit Lambda
Ismael
 
PDF
Feedback dos Testes
Ismael
 
PDF
Refactoring Databases - Estrategias
Ismael
 
PDF
Refactoring Databases - parte 1
Ismael
 
TDC 2020 - Trilha de Management 3.0 e Gestão Ágil
Ismael
 
Introducao ao Pensamento Sistemico
Ismael
 
Testes de unidade alem do basico
Ismael
 
Bluesoft Culture
Ismael
 
Como dar e receber feedbacks
Ismael
 
Eficiencia de fluxo
Ismael
 
Como você testa seu software TDC 2017
Ismael
 
Como ter Entregas Frequentes
Ismael
 
JUnit 5 vs JUnit 4
Ismael
 
Conceitos por trás do Ágil
Ismael
 
Boas Praticas de Testes, Bad Smell e Outros Macetes
Ismael
 
8 passos para mudança de John Kotter
Ismael
 
Curva da Mudança Kubler-Ross
Ismael
 
DevCamp 2016
Ismael
 
7 Caracteristicas de um bom Lider Agil
Ismael
 
Law of demeter
Ismael
 
Junit Lambda
Ismael
 
Feedback dos Testes
Ismael
 
Refactoring Databases - Estrategias
Ismael
 
Refactoring Databases - parte 1
Ismael
 

Último (16)

PPTX
Curso de Java 5 - (Strings) Tipo de Dados.pptx
Anderson Maciel
 
PPTX
Computacao-e-Tecnologias-Digitais-Por-Que-Aprender.pptx
RobertaOliveiradaFon1
 
PPTX
Curso de Java 7 - (ArrayList, Collections,(Set, List, Queue, Map)).pptx
Anderson Maciel
 
PPTX
Curso de Java 6 - (Números, Data e Hora).pptx
Anderson Maciel
 
PPTX
22 - Lógica de Programação com Portugol.pptx
Anderson Maciel
 
PPTX
21 - Lógica de Programação com Portugol.pptx
Anderson Maciel
 
PDF
Certificado em Redes Neurais Artificiais em Python
CaioSilva506151
 
PPTX
Gestão de Mudanças - Fases do processo de mudança organizacional
Gateware Group
 
PPTX
Curso de Java 3 - (Estruturas de Controle, Decisão, Loop, Procedimento).pptx
Anderson Maciel
 
PPTX
Curso de Java 1 - (Introdução Geral).pptx
Anderson Maciel
 
PDF
Explorando o Futuro do Corpo: Implantes Neurais e o Biohacking dos Sentidos
cooperliora
 
PPTX
aplicativopenseira.pptx Aplicativo que organiza Pensamentos - Peça Publicitária
StelaNorie1
 
PPTX
Curso de Java 4 - (Orientação a Objetos).pptx
Anderson Maciel
 
PPTX
Curso de Java 2 - (PrimeiroPrograma, Variáveis, Tipos e Operadores.pptx
Anderson Maciel
 
PPTX
Desenvolvimento-de-Produtos-Inovadores.pptx
ssuser1d7565
 
PPTX
Gestão de Mudanças - Os maiores desafios da Gestão de Mudanças e Gestão de Pr...
Gateware Group
 
Curso de Java 5 - (Strings) Tipo de Dados.pptx
Anderson Maciel
 
Computacao-e-Tecnologias-Digitais-Por-Que-Aprender.pptx
RobertaOliveiradaFon1
 
Curso de Java 7 - (ArrayList, Collections,(Set, List, Queue, Map)).pptx
Anderson Maciel
 
Curso de Java 6 - (Números, Data e Hora).pptx
Anderson Maciel
 
22 - Lógica de Programação com Portugol.pptx
Anderson Maciel
 
21 - Lógica de Programação com Portugol.pptx
Anderson Maciel
 
Certificado em Redes Neurais Artificiais em Python
CaioSilva506151
 
Gestão de Mudanças - Fases do processo de mudança organizacional
Gateware Group
 
Curso de Java 3 - (Estruturas de Controle, Decisão, Loop, Procedimento).pptx
Anderson Maciel
 
Curso de Java 1 - (Introdução Geral).pptx
Anderson Maciel
 
Explorando o Futuro do Corpo: Implantes Neurais e o Biohacking dos Sentidos
cooperliora
 
aplicativopenseira.pptx Aplicativo que organiza Pensamentos - Peça Publicitária
StelaNorie1
 
Curso de Java 4 - (Orientação a Objetos).pptx
Anderson Maciel
 
Curso de Java 2 - (PrimeiroPrograma, Variáveis, Tipos e Operadores.pptx
Anderson Maciel
 
Desenvolvimento-de-Produtos-Inovadores.pptx
ssuser1d7565
 
Gestão de Mudanças - Os maiores desafios da Gestão de Mudanças e Gestão de Pr...
Gateware Group
 

Spock Framework

  • 1. Spock Framework Parte 1 Ismael Soares
  • 2. Spock é um framework de testes para aplicações Java e Groovy.
  • 3. Diferenciais JUnit Código bonito Fácil de aprender Altamente expressivo Utiliza recursos da linguagem Groovy
  • 4. Quem Usa? Gradle Grails + + +
  • 5. import spock . lang .* class HelloSpock extends spock . lang . Specification {     def "length of Spock's and his friends' names" () {         expect :         name . size () == length         where :         name     | length         "Spock“ | 5         "Kirk"   | 4         "Scotty" | 6     } } Exemplo
  • 6. // Executado antes de cada método def setup () {}           // Executado depois de cada método def cleanup () {}         // Executado antes do primeiro método def setupSpec () {}     // Executado após o último método def cleanupSpec () {}   Ciclo de vida
  • 7. Configura os recursos necessários para o teste. Proporciona o estímulo para o teste Descreve as respostas esperadas Limpa os recursos utilizados no teste. Fases
  • 9. setup/given: // criar fixtures when :   // estímulos then && and :   // respostas cleanup: // limpar fixtures Fases
  • 10. when :”incluir um elemento na pilha” pilha . push ( elemento ) then :”ela não pode ficar vazia” ! pilha . empty pilha . size () == 1 and :”deve conter o elemento incluído” pilha . peek () == elemento Exemplo
  • 11. Condition not satisfied : pilha . size () == 2 |     |       |   |     1       false [ push me ] Resultado
  • 12. when :”retirar os elementos de pilha vazia” pilha . pop () then :”deve retornar Exception” def e = thrown ( EmptyStackException ) e.message == ‘bla’ stack . empty Exception
  • 13. def "HashMap accepts null key" () {   given :“um mapa”   def map = new HashMap ()     when :”incluir um elemento com a chave null”   map . put ( null , "elem" )     then :”não deve retornar exception”   notThrown ( NullPointerException ) } Exception
  • 14. def "events are published to all subscribers" () {   setup : def subscriber1 = Mock ( Subscriber )   def subscriber2 = Mock ( Subscriber )   def publisher = new Publisher ()   publisher . add ( subscriber1 )   publisher . add ( subscriber2 )     when :   publisher . fire ( "event" )     then :   1 * subscriber1 . receive ( "event" )   1 * subscriber2 . receive ( "event" ) //Alternativa (qualquer mock) 2 * _. receive ( "event" ) } Interações
  • 15. // Global setup : subscriber . isAlive () >> true // Local when : publisher . send ( event ) then : 1 * subscriber . receive ( event ) //Válido para o que está acima //Opicional then : subscriber . isAlive () >> true //Obrigatório then : 1 * subscriber . isAlive () >> true then : n * subscriber . receive ( event ) //Cardinalidades n * subscriber . receive ( event )       // exatamente n vezes ( n .. _ ) * subscriber . receive ( event ) // as vezes pelo menos n vezes ( _ .. n ) * subscriber . receive ( event ) // no máximo n vezes //Regex subscriber ./ set .*/( _ ) // qualquer setter que for chamado do subscriber Interações
  • 16. // sem argumentos subscriber . receive ()             // qualquer argumento subscriber . receive ( _ )                   // qualquer argumento não nulo subscriber . receive (! null )                 // argumento específico subscriber . receive ( event )               // qualquer argumento diferente do específico subscriber . receive (! event )               // qualquer argumento do tipo Message (não nulo) subscriber . receive ( _ as Message ) // constraint customizada         subscriber . receive ( { it . priority >= 5 } ) Restrições de Argumentos
  • 17. Para métodos que usam vários argumentos // qualquer três argumentos mock . foo ( _ , _ , _ )                     // qualquer argumento no primeiro, não nulo no segundo e no terceiro, uma regex mock . foo ( _ , ! null , { it ==~ / a * b / }) // restrições para varargs podem ser especificadas em estilo de lista ou estilo vararg: def foo(String... args) // estilo lista mock . foo ([ "one" , "two" ]) // estilo vararg mock . foo ( "one" , "two" )  
  • 18. Na próxima apresentação... Valores de retorno Verificações ordenadas Bloco Expect Bloco Cleanup Bloco Where Métodos Helper Spock Vs JUnit

Notas do Editor

  • #4: Altamente expressivo: escrevemos o código da mesma forma que fariamos para nos expressar. JUnit: compatível com diversas IDEs, ferramentas de build e testes de integração contínua.
  • #5: Gradle (grueilou): trata-se de um sistema de build baseado em Groovy que trás a expressividade desta linguagem para o mecanismo de build, o que torna nossos scripts muito mais legíveis e fáceis de escrever.
  • #9: Spock tem suporte embutido para a execução de cada uma das fases conceituais de um método. Para este fim, métodos são estruturados em blocos.
  • #11: Frases nos blocos são opcionais: As condições são escritas como expressões booleana ssimples, eliminando a necessidade de uma afirmação API.
  • #12: Como você pode ver, Spock captura todos os valores produzidos durante a avaliação de uma condição, e apresenta-os numa forma facilmente de entender.
  • #15: Clique 2 vezes Eventos são publicados para todos os assinantes subscriber: assinantes Publisher: editora Receive: ruecive (receber)