@Given, a tarefa e construir um objeto que representa a app Hello, definida na especificacao do cenario. Entao, e criada uma instancia de uma classe que sera construida a seguir (com.ladoservidor.cucumber.helloworld.Hello). O conteudo da anotacao e uma expressao regular (ER) que "casa" com o conteudo definido para Given na funcionalidade especificada (arquivo .feature). Observe que, como sugerido pelo Cucumber, faremos o uso de um parametro especificado entre aspas na ER, cujo valor sera passado para o parametro greeting do metodo I_have_a_hello_app_with. A instancia que criaremos de Hello recebera o valor do parametro greeting.No metodo anotado por @When definiremos, como expliquei, a acao sugerida na especificacao da cenario. Nesse caso, a acao sera invocar um metodo responsavel por "dizer algo". Sendo assim, faremos uso da instancia de Hello (criada na chamada ao metodo @Given) e invocaremos o metodo sayHi salvando sua resposta no objeto hi.No metodo anotado por @Then temos a responsabilidade de averiguar uma mudanca de estado ocorrida (@When) dada uma determinada situacao (@Given). Pela descrito no cenario, dado que a app hello recebe 'Hello' como parametro, quando solicitarmos que ela diga algo, ela devera responder 'Hello World'. E, e esta verificacao que devemos implementar. Atraves da assertiva assertEquals do JUnit verificaremos se o valor recebido como conteudo do parametro da ER repassado para expectedHi e o que salvamos no objeto hi.Veja que, assim como na pratica de TDD, com BDD definimos a classe que criaremos (Hello), seus metodos (sayHi) e seu comportamento esperado dada uma determinada situacao. Sendo assim, partiremos agora para a criacao da classe Hello: (copie e cole os comandos a seguir em teu shell)d=src/main/java/com/ladoservidor/cucumber/helloworldmkdir -p $dcat > $d/Hello.java <<'EOF'package com.ladoservidor.cucumber.helloworld;public class Hello { private final String greeting; public Hello(String greeting) { this.greeting = greeting; } public String sayHi() { return greeting + " World"; }} EOFPronto! Agora, podemos executar novamente o comando "mvn test" que devera conter, na saida gerada, o seguinte trecho de texto: (execute esse comando e verifique sua saida para checar se estamos de acordo)------------------------------------------------------- T E S T S-------------------------------------------------------Running com.ladoservidor.cucumber.helloworld.RunCukesTestFeature: Hello World Scenario: Say hello # com/ladoservidor/cucumber/helloworld/helloworld.feature:3 Given I have a hello app with "Hello" # HelloStepdefs.I_have_a_hello_app_with(String) When I ask it to say hi # HelloStepdefs.I_ask_it_to_say_hi() Then it should answer with "Hello World" # HelloStepdefs.it_should_answer_with(String)Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.945 secResults :Tests run: 4, Failures: 0, Errors: 0, Skipped: 0Utilizando o portuguesPara completar as tarefas praticas desta primeira parte vamos nacionalizar o uso do Cucumber alterando nossa aplicacao "Hello World" para "Ola Mundo!".Isto e muito valido ja que, como citei, o interessante e que as estorias de usuarios possam ser escritas, ou pelo menos, totalmente compreendidas e validadas, por eles. Sendo assim, pensando em usuarios nacionais, nada mais correto que o amplo uso do portugues do Brasil para a definicao dos arquivos de funcionalidades (arquivos ".feature").Entao, para migrar nossa aplicacao, nosso primeiro passo sera alterar o codigo da funcionalidade. Copie e cole o seguinte codigo em teu shell:d=src/test/resources/com/ladoservidor/cucumber/helloworldcat > $d/helloworld.feature <<'EOF'# language: ptFuncionalidade: Diga Ola Cenario: Dizer "Ola Fulano!" Dado que eu tenho uma app que recebe "Paulo"