Git na prática: Entendendo o rebase

Olá Pessoal,

No post de hoje vamos entender o rebase que temos no git.  Acho umas das mais importantes features do git.

Lets go…

Starting …

O rebase é algo tão comum quanto tomar café todos os dias. Na prática, precisamos dele quando estamos trabalhando na branch e sabemos que o repositório master foi atualizado por outros desenvolvedores e precisamos ter nosso branch atualizado, concorda? Não  é nada legal ficarmos trabalhando na branch com o código de 2 dias atrás. Podemos ter problemas e sérios conflitos aqui na hora do merge, o melhor é que se for ter conflito que seja pequeno e de imediato.

In practice

Considerando o cenário dos posts anteriores onde temos a branch development, vamos supor que ficamos trabalhando na branch por alguns dias e a master sofreu alteração, alguém adicionou um novo arquivo lá e fez o commit.

E agora precisamos trazer esse novo arquivo para o branch, assim vamos garantir que nossa branch está igual à master.

Para isso:

1      Vamos na branch git checkout development

2      Dizer para realizar um rebase da branch master

git rebase master

E o que acontece aqui?

Simples, o git se encarrega de colocar os commit que foram feitos na branch em uma branch temporária e pega os commits da master e coloca na branch, depois ele pega os commit que ele mesmo colocou na branch temporária e coloca de volta na branch development. Aqui ele valida commit por commit, ou seja, é possível ter conflito e teremos que resolver manualmente. Veja como ficou o branch com o novo arquivo que tínhamos apenas na master:

A seguir o ciclo:

E depois que terminamos de trabalhar com a branch podemos fazer um merge, como vimos nesse post. E termos a master atualizada, conforme podemos ver na última imagem (de cima para baixo).

Esse é o rebase. Simples, não?

See ya !! Abraços.

Fazendo Mocks com DAO Mockito

Olá Pessoal,

O post de hoje veremos como usar Mockito para coberir classes e metodos DAO.  Eu particularmente gosto de usar BDUnit para testes funcionais assim, mas há quem não gosta. Para não dizer que temos apenas uma solução resolvi escrever esse post.

Lets go..

Starting..

É comum achar que não é possível chamar o método real usando mock, mas analisando a documentação vamos encontrar um cara que permite chamar o método real, usando o mesmo contexto de mock,. Isso permite manter todo seu test com mock e ainda cobrir o que é de fato necessário.

No  padrão de uso da mock, o código a seguir não rola cobertura, uma vez que estamos usando a mock, então o método real não é chamado:

@Test

            public void testBuscaEmailCadastrado() {                   

                         user.setEmail(“camilo@”);

                      when(usuarioDaoMock.buscaUsuarioPorEmail(user)).thenReturn(user); 

        assertNotNull(usuarioDaoMock.buscaUsuarioPorEmail(user));

            }

Como podemos ver na imagem acima,  vermelho significa que não tem cobertura naquele código, uma vez que não há test case chamando ele direto.

E como resolver isso?

Para resolver é muito simples. Porém, antes de apresentar a solução vamos a outro fato tradicional, testar métodos do tipo void. Sabemos que com assert não é possível testar um método void, uma vez que este retorna “nada”. Mas com mock podemos chamar um método void e testá-lo, afetando assim a cobertura. Vejamos como:

O método doCallRealMethod() permite chamar o método real da mock, independente do tipo deste método. Sendo assim, void agora pode ser chamado e verificado no seu test case. É comum ver programadores tendo que converter um determinado método do tipo void para return alguma coisa só para satisfazer o test case. Sem o uso de mock (mockito) temos que fazer isso, porque não temos nenhum assert para verificar um tipo void que não retorna “nada”.

Observe na imagem a seguir o resultado, agora está cobrindo o DAO:

 

Note: segundo a documentação, o uso doCallRealMethod() é algo que deve ser feito cuidadosamente, pois significa que há algum tipo de complexidade no seu código, mas também não deixam de falar que há casos raros onde é possível usar the partial mock warning (é o nome que se dá quando chamamos um método real usando mock).

O code:

1         Mockito.doCallRealMethod().when(usuarioDaoMock).buscaUsuarioPorEmail(user);                               

2         assertEquals(usuarioDaoMock.buscaUsuarioPorEmail(user).getEmail(),user.getEmail());

A leitura do code: “chame o método real quando o método buscaUsuarioPorEmail for chamado pela usuariodaomock e passe o valor user para ele”.

Assim o mockito vai lá na classe que possui o método real e chama ele de fato, como vimos na imagem anterior, onde o código passa a ser coberto.

Um possível Problema

            O único problema é que precisamos ter o banco de dados rodando, ou seja, UP para as funções que precisa consultar. Pode parecer óbvio, mas nem tanto, porque quando usamos a mock apenas, esta simula a chamada e o valor esperando independente do banco estar ON/OFF.

Resultado com o banco OFF é o seguinte:

org.hibernate.exception.JDBCConnectionException: Cannot open connection

            Mas não esqueçam que ainda temos a vantagem de testar métodos do tipo void, fazendo a cobertura passar por ele. No contexto acima, na maioria das vezes vamos ter um BD ON, pois queremos ver se o nosso CRUD/DAO está fazendo o que de fato esperamos que ele faça, que é a comunicação com o BD, porém daí já estaríamos caminhando mais para tests funcionais que tests cases de fato.

Na imagem a seguir temos a cobertura em todo DAO. Observe que foi implementado um novo método que busca no banco um email e este não existe, daí verificamos se de fato o código entra no catch e este está coberto.

Cobertura antes


Cobertura depois

Mas, uma solução também é usar o banco em memoria como HSQLDB assim você poderá executar seus testes contra o banco automaticamente, ou seja, você não precisar iniciar ou parar o banco.

Vou ficando por aqui.

Abracos, see ya!!

Lançamento E-book “Guia do exame SCJP”

 

olá Pessoal,

Um post extra da semana. Após muitos pedidos, conseguir ver a com a editora a possibilidade de lançarmos uma versão e-book para o livro “Guia do Exame SCJP”. Uma vez que na época de publicação a editora ainda não trabalhava com e-books. E finalmente conseguimos. Confira nesse link.

abracos, see ya!!

Review Livro “Spring Persistence with Hibernate”

Olá Pessoal,

No post de hoje vou falar o que achei sobre o livro “Spring Persistence with Hibernate”. Apesar de ter comprado no inicio do ano, eu não tinha lido ainda. Sempre gosto de ter mais de 1 livro sobre o mesmo assunto, assim consigo comparar abordagens diferentes e sempre consigo aprender algo novo. Em breve farei um review do livro “Sprint in action third edition”... já tá na fila.

Review Geral

Primeiramente o livro é bem pequeno, são apenas 11 capítulos, totalizando 235 páginas, sendo os dois últimos opcionais a leitura. Os capítulos não são grandes, isso ajuda a não ser tão cansativo, possibilitando terminar a leitura quando temos pouco tempo pra ler. Exceto 1 ou 2 capítulos que foram longos e acho que os autores poderiam ter quebrado. A escrita é confortável e a linguagem usada também. Há uns pontos informais e outros formais, mas não vi nada de especial no formato adotado.

A Teoria

Realmente aqui os autores dão um show em boa parte do livro. São poucas que ficam a desejar, onde percebemos que faltou algo, mas na maioria eles explicam sempre os detalhes do assunto, falam o porquê das coisas, porém tem que tomar cuidado, pois há tópicos que eles se perdem ou se aprofundam demais e que você se pergunta: “do que ele tá falando agora? Qual relação com o que ele falou no tópico anterior?”.

Mas gostei muito da forma que eles explicam com detalhes o assunto.

A parte Prática

Essa aqui ficou a desejar (e muito). Infelizmente o livro não tem nada de prático. Você não consegue apenas com o livro terminar um capítulo e colocar mão na massa sobre o que ele acabou de explicar. E pior, os autores nem motivam e nem prepararm o livro para isso. Muita coisa quando li tive que ir nas referências do Spring para entender ou pesquisar no google. No inicio do livro eles falam de uma aplicação que vai servir de exemplo, mas só tem trechos do código que por cima confunde mais do que ajuda em boa parte. Enfim, se você espera colocar a mão na massa após ler os capítulos, esqueça, porque o livro não oferece isso. Achei muito ruim e estranho isso para um livro de programação.

Conclusão

Eu não recomendaria o livro para quem é iniciante com Spring ou Hibernate (ou quem for iniciante nos dos dois), pois no final, de forma prática você não aprende nada. Teoricamente pode até saber como funciona, mas na hora que abrir o eclipse você vai se perguntar: e agora, o que faço? Por onde começo?

Bom pessoal, esse é meu review sobre o livro “Spring Persistence with Hibernate”. Espero que tenham gostado. Mandei um email para um dos autores dando meu feedback com as mesmas informações acima. Até o momento não obtive retorno. Em breve postarei mais review aqui no blog.

Abracos,

See ya!!

Criando projeto JSF com Maven no Eclipse

Olá Pessoal,

No post de hoje vamos ver como criar um projeto JSF no Eclipse já suportando o Maven. Parece algo simples,  concorda? Mas pode dar uma dor de cabeça, e veremos o motivo.

Lets GO…

Starting…

Antes de mais nada instale o Jboss tools, conforme este post. Após a instalação, vamos ver o cenário que temos.

  • Maven 3.x
  • Eclipse Helios

Cenário 1

Você pode adicionar o maven ao seu projeto manualmente, ou seja, basta adicionar o pom.xml ao projeto e fazer as devidas configurações. Ideal é quando você já tem um projeto e no inicio não usava o maven, mas resolveu adotar agora, daí você não vai querer deletar o projeto e criar um novo “maven Project” certo. Mas sabemos que fazer configuração manualmente sempre é chato. Porém essa é uma forma de você adicionar o Maven ao seu projeto.

Cenário 2

Você está querendo começar um projeto do zero, tipo JSF Project. Mas, ao criar, vê que ele não está na estrutura do maven. E o que fazer? Podemos ir pelo cenário 1. Mas e se eu quiser já criar automático?  Há uma opção usando o File  New  Maven Project.



Quando escolhemos Maven Project há varias opções de criar um projeto, desde um simple maven Project, até um Project webapp.  Na imagem a seguir você pode ver as opções de maven Project disponíveis, porém muitos deles estão com bugs críticos que não cria o projeto ou dá umas exceções e trava tudo. Um exemplo é a appfuse para jsf + hibernate + Spring. Se tivesse funcionando seria muito show, mas infelizmente não está.  E o que fazer ir para o cenário 1?

É o que fiquei pensando. Apesar de podermos criar a nossa própria estrutura archetypes http://maven.apache.org/guides/mini/guide-creating-archetypes.html e ser fácil e rápido, mesmo assim ainda fiquei incomodado pelo fato de não conseguir gerar um projeto JSF, já com o Maven consegui com apenas alguns cliques.

Solução?

Sim, depois de muitas horas tentando entender o motivo e quebrando a cara com alguns plugins, achei um workaround. Vamos lá:

Crie um Maven Project (File è new è Project è maven project)

Na próxima tela deixe assim:

Clica em next e na tela seguinte vamos escolher maven-achetype-webapp

Clica em next

E agora vamos preencher. Estou presumindo que você já conhece o maven, então não irei explicar o que significa cada campo. Veja como ficou a minha:

Clique em finish.

Como você percebeu, o workaround foi criar um projeto do tipo webapp, mas ainda o projeto não tem suporte JSF, podemos fazer isso manualmente ou automaticamente. Clique com o botão direito no projeto e escolha configure >> add jsf capabilities:

Escolha o Servlet version 2.5

Clique em finish, no warning que aparecer clique em Yes

O projeto vai ficar “quebrado”, pois a versão do web.xml está diferente. Abra o web.xml e altere o version para 2.5

Agora precisamos adicionar as libs para JSF no pom.xml. Abra o pom.xml e clique na aba dependencies

E adicione:

com.sun.faces jsf-api

com.sun.faces jsf-impl

Não esqueça de adicionar também:

javax.servlet javax.servlet-api

javax.servlet jstl

Feito isso seu projeto deve tá assim:

Workaround para Windows 7

Quem tem Windows 7 pode se deparar com o problema de não conseguir executar “cmd” e para resolver o problema basta adicionar ao path do sistema o seguinte valor:

%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem

O Maven não está atualizando no eclipse

Passei por esse problema de alterar o pom.xml e o maven não fazer o download das libs e a modificação não refletir no eclipse, daí basta forçar o download:

mvn eclipse:eclipse -DdownloadSources=true

Vou ficando por aqui, espero que tenham gostado do post.

See ya!