Quando usar Mocks e Stubs?

Bom dia Pessoal.

Continuando os estudos sobre TDD e BDD, estes dias me venho a questão:
- Quando usar Mocks/Stubs?
- Quando não usar?

Então pensei, isso é uma boa questão, pois se você exagerar no uso deles seus testes podem se tornar fakes, desnecessários e/ou confusos.

O que são Mocks

Segundo Martin Flower, são instancias de objetos reais, mas treinados para dar retornos esperados. Para utiliza-los você precisa de um framework, por exemplo no Java temos o Mockito, EasyMock entre outros.

Exemplo:

   @Test
   public void testGivenNewBehaviorForToStringWhenCastItShouldReturnNewReturn()
   {
      // given
      String resultExpected = "New Return";
      MyObject instance = Mockito.mock(MyObject.class);
      Mockito.when(instance.toString()).thenReturn(resultExpected);
      
      // when
      String result = instance.toString()
      
      // then
      assertEquals(resultExpected, result);
    }

O que são Stubs

Segundo Martin Flower, são implementações de interfaces com retorno esperados para testes de integração.

Veja o exemplo, vamos supor que temos a seguinte interface:

  public interface IJob {
    public String getResult();
  }

E uma classe usando ela:

class Worker {
  private IJob job;
  
  public void setJob(IJob job)
  {
     this.job = job;
  }

  public String work()
  {
     return job.getResult();
  } 
}

Seu teste usando Stub seria assim:

 class WorkerTest extend TestCase {
     @Test
     public void testGivenNewJobWhenWorkItShouldReturnJobDone()
     {
         // given
         String resultExpected = "Job done.";
         Worker worker = new Worker();
         worker.setJob(new StubJob());

         // when
         String result = worker.work();         

         // then
         assertEquals(resultExpected, result);
     }

     class StubJob implements IJob {
         @override 
         public String getResult()
         {
            return "Job done.";
         }
     }
 }

Quando devo usar?

Teste Unitário , como o proprio nome diz, é o teste da classe/funcionalidade/comportamento esperado. Se para testar isso, você tem que se preocupar muito com dependências, acesso a banco, webservice, configurações e isto irá influênciar no resultado, talvez a saída seja o uso de mocks/stubs para emular estes retornos e testar só as funcionalidades da classe que possui estas dependências.

Quando usar um e quando usar outro?

Segundo Dave Sayer em seu artigo para spring.io (Artigo em Inglês):

Seu teste deve ser fácil de ler e manter, então utilize a ferramenta que mais se adapte a estas duas necessidades. Caso o teste começe a ficar complexo dificultando o entendimento do que está sendo testado, talves seja o momento de repensar ele.

Abraços

Série de Videos sobre UML

Bom dia Pessoal.

Recentemente me deparei com esta série de videos criadas pelo Derek Banas. Estes tutoriais são muito bons e simples de entender, porem todos são em Inglês. Vale a pena dar uma olhada:

A ferramenta que ele utiliza é a UMLet

UML – Use Cases

UML – Activity Diagrams

UML – Class Diagram

Neste link você pode ver todas os videos da série totalmente de graça!
https://www.youtube.com/watch?v=OkC7HKtiZC0&list=PLGLfVvz_LVvQ5G-LdJ8RLqe-ndo7QITYc

Att.
Cristian Oliveira

Bug do Facebook-sdk para Android

Bom dia Pessoal.

Recentemente enquanto desenvolvia o protótipo do Ivokee, tive diversos casos de erros com o Facebook-SDK relatados pelos usuários, principalmente quando usavam o aplicativo com a rede 3G. Verificando os logs descobri que este era um bug do proprio SDK do Facebook, ao fazer download da imagem do perfil e por algum motivo ocorria um erro, este a descrição do erro era “baixada” do servidor, mas não havendo resposta era retornado nulo a variavel “stream”, pois acredito que o mesmo não foi feito para trabalhar com a nossa maravilhosa 3G.

O trace do erro:

java.lang.NullPointerException at java.io.Reader.(Reader.java:65) at java.io.InputStreamReader.(InputStreamReader.java:65) at com.facebook.internal.ImageDownloader.download(ImageDownloader.java:248) at com.facebook.internal.ImageDownloader.access$1(ImageDownloader.java:205) at com.facebook.internal.ImageDownloader$DownloadImageWorkItem.run(ImageDownloader.java:356) at com.facebook.internal.WorkQueue$1.run(WorkQueue.java:118) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) at java.lang.Thread.run(Thread.java:1096)

Fiz um fork do projeto e corrigi este erro. Enviei um Pull Request deste meu fork ao pessoal do Facebook aqui.

Caso tenham interesse segue fork corrigido:

https://github.com/CristianOliveiraDaRosa/facebook-android-sdk.

Grande abraço.

Cristian Oliveira

Google Translate Grátis com Java

Bom dia Pessoal.

Algum tempo atrás no projeto Ivokee, aplicativo para android, precisei realizar translates para testes e para criar um protótipo. Porem o google não disponibiliza a API do Translate sem custo.
Se não me engano, não era nada muito caro, mas como estavamos fazendo um protótipo preferi procurar uma solução Free.

Procurando em foruns e grupos descobri uma url onde era possível baixar traduções do translate.google.com então criei uma classe para acessar esta url e realizar o download desta tradução em real time, com uma performance muito boa.

Para conseguir os códigos faça:

  git clone git@github.com:CristianOliveiraDaRosa/jafregle.git

Ou baixe diretamente em:

jafregle

 

Abraços
Cristian Oliveira