Top Posts

Obtendo o certificado da Sun

Continue lendo

Série Dropbox Lançamento easyJavaDropboxAPI for Java Developer

Posted by camilolopes | Posted in Java, Series | Posted on 24-01-2014

2

Olá Pessoal,

É com muito prazer que venho apresentar pra vocês mais um trabalho da minha start-up: a ITS. Estamos trabalhando bastante com o dropbox aqui para soluções corporativas, e até final do ano devemos lançar uma plataforma para comunidade que vai estar usando a tecnologia. Nesse trabalho percebemos que era necessário criar uma API Java para o dropboxAPI. O motivo? Tínhamos muito trabalho sempre que um projeto ia precisar o dropbox API, ai decidi criar uma API  que chamei de easyJavaDropboxAPI. Como sabemos, qualidade de software, produtividade e manutenção é um desafio sempre e aqui acreditamos bastante no aprendizado contínuo para melhorar o que fizemos ontem, hoje e amanhã.  A seguir explico mais sobre a API e mostro um exemplo simples de uma aplicação Java  + easyJavaDropboxAPI.

lets go…

easyJavaDropboxAPI

Tudo começou de uma simples ideia, e enquanto fui dormir com um problema achei a solução durante os sonhos. Pode acreditar, foi verdade isso. Dei inicio aos estudos e achei a solução na api do dropbox. Infelizmente não posso entrar em detalhes do negócio, pois foi para um projeto corporativo que usamos. Outros projetos chegaram e precisamos da API, então certa hora eu disse “pessoal, precisamos criar uma API Java para o dropbox API. Já temos vários projetos usando e vai ser complicado dar manutenção”. Antes de tornar a easyJavaDropboxAPI pública, ela tinha outro nome, easyDropboxAPI. E por que eu deveria usar a easyJavaDropboxAPI e não diretamente API dropbox API?

É dificil responder a pergunta acima, mas vou mostrar os motivos que nos levou aqui na ITS a termos uma API .

 

Problemas

Produtividade

Estamos crescendo com soluções enterprise usando dropbox API e já estávamos entrando no terceiro projeto quando vimos que o custo de manutenção estava começando a aparecer. No inicio não tínhamos noção do quanto a API poderia ajudar em outros projetos e foi preciso usar em um projeto interno, testar por um período não só a funcionalidade, mas outros fatores de negócio. Por isso que não começamos criando uma API, mas a coisa “virou” e agora queremos ganhar tempo, e com a API é muito simples sair usando em meia dúzia de linhas e em poucos minutos você já está conectado ao dropbox.

Manutenção

Agora não é preciso ficar preocupado com a manutenção do código que conecta com a API do dropbox. Como o dropbox team está sempre atualizando e lançando novas features, temos apenas um único local que vai ter essa feature atualizada e os projetos que precisarem faz o update do .jar para a versão mais recente.

Desenvolvimento Ágil

Na interface temos os métodos mais comuns e objetos do dropbox API que é a base do serviço, então um desenvolvedor novo precisa inicialmente entender pontualmente e à medida que ele for evoluindo vai entrando nos detalhes. Por exemplo, se você pretende listar os arquivos que está no diretório /home do seu dropbox o que precisa ser feito?

1. Saber o que é um token e gerar um;

2. Chamar o método listFiles que retorna todos os arquivos do diretório informado

Cada elemento no list é um arquivo do diretório.

Esses três pontos foram o suficiente para termos API e impactou bastante no dia a dia desenvolvimento.

Vamos ver na prática?

Praticando

1. Crie um simple maven project

2. Adicione a dependência no pom.xml

dropboxeasyjavaapipom

 

 

3. Adicione o nosso repositório no pom.xml

 

4. Crie uma classe Java com o método main

 

 

5. Gere o token seguindo as instruções:

http://apps.camilolopes.com.br/dpboxapiweb

 

6. Rode aplicação e verá:

dropboxconsoleasyapi

 

Pronto, os arquivos que tenho na pasta são listados.

Simples, não?

O projeto de exemplo está disponível no repositório da ITS.

E caso queriam saber mais sobre API, visite o repositório:

https://github.com/ITSStartup/easyJavaDropboxAPI

Abracos. See ya!!!

Fazendo Mocks com DAO Mockito

Posted by camilolopes | Posted in Agile/Scrum/TDD, Java | Posted on 08-02-2013

0

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!!