curso java testes

178
FJ-16 Laboratório Java com Testes, XML e Design Patterns

Upload: marcelo-rodrigues

Post on 12-Mar-2016

269 views

Category:

Documents


2 download

DESCRIPTION

Testes java testes

TRANSCRIPT

  • FJ-16Laboratrio Java com Testes,

    XML e Design Patterns

  • Conhea mais da Caelum.

    Cursos Onlinewww.caelum.com.br/online

    Blog Caelumblog.caelum.com.br

    Newsletterwww.caelum.com.br/newsletter

    Facebookwww.facebook.com/caelumbr

    Twittertwitter.com/caelum

    Casa do CdigoLivros para o programador

    www.casadocodigo.com.br

  • Conhea alguns de nossos cursos

    FJ-11: Java e Orientao a objetos

    FJ-26: Laboratrio Web com JSF2 e CDI

    FJ-16: Laboratrio Java com Testes, XML e Design Patterns

    FJ-19: Preparatrio para Certificao de Programador Java

    FJ-21: Java para Desenvolvimento Web

    FJ-31: Java EE avanado e Web Services

    FJ-91: Arquitetura e Design de Projetos Java

    RR-71:Desenvolvimento gil para Web 2.0 com Ruby on Rails

    RR-75:Ruby e Rails avanados: lidando com problemas do dia a dia

    Mais de 8000 alunos treinados; Reconhecida nacionalmente; Contedos atualizados para o mercado e para sua carreira; Aulas com metodologia e didtica cuidadosamente preparadas; Ativa participao nas comunidades Java, Rails e Scrum; Salas de aula bem equipadas; Instrutores qualificados e experientes; Apostilas disponveis no site.

    Para mais informaes e outros cursos, visite: caelum.com.br/cursos

    FJ-25: Persistncia com JPA2 e Hibernate

  • Sobre esta apostilaEsta apostila daCaelumvisa ensinar de umamaneira elegante, mostrando apenas o que necessrio e quando necessrio, no momento certo, poupando o leitor de assuntos que no costumam ser de seu interesse emdeterminadas fases do aprendizado.

    A Caelum espera que voc aproveite esse material. Todos os comentrios, crticas e sugestes sero muitobem-vindos.

    Essa apostila constantemente atualizada e disponibilizada no site da Caelum. Sempre consulte o site paranovas verses e, ao invs de anexar o PDF para enviar a um amigo, indique o site para que ele possa semprebaixar as ltimas verses. Voc pode conferir o cdigo de verso da apostila logo no nal do ndice.

    Baixe sempre a verso mais nova em: www.caelum.com.br/apostilas

    Esse material parte integrante do treinamento Laboratrio Java com Testes, XML e Design Patterns e dis-tribudo gratuitamente exclusivamente pelo site da Caelum. Todos os direitos so reservados Caelum. Adistribuio, cpia, revenda e utilizao para ministrar treinamentos so absolutamente vedadas. Para usocomercial deste material, por favor, consulte a Caelum previamente.

    www.caelum.com.br

    1

  • Sumrio

    1 Tornando-se um desenvolvedor pragmtico 11.1 O que realmente importante? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 A importncia dos exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.3 Tirando dvidas e referncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.4 Para onde ir depois? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    2 Omodelo da bolsa de valores, datas e objetos imutveis 42.1 A bolsa de valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.2 Candlesticks: O Japo e o arroz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.3 O projeto Tail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.4 O projeto Argentum: modelando o sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.5 Trabalhando com dinheiro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.6 Palavra chave nal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.7 Imutabilidade de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.8 Trabalhando com datas: Date e Calendar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.9 Exerccios: o modelo do Argentum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.10 Resumo dirio dos negcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.11 Exerccios: fbrica de Candlestick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.12 Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

    3 Testes Automatizados 293.1 Nosso cdigo est funcionando corretamente? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.2 Exerccios: testando nosso modelo sem frameworks . . . . . . . . . . . . . . . . . . . . . . . . . 293.3 Denindo melhor o sistema e descobrindo mais bugs . . . . . . . . . . . . . . . . . . . . . . . . 323.4 Testes de Unidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.5 JUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333.6 Anotaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343.7 JUnit4, convenes e anotao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353.8 Exerccios: migrando os testes do main para JUnit . . . . . . . . . . . . . . . . . . . . . . . . . . 373.9 Vale a pena testar classes de modelo? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423.10 Exerccios: novos testes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433.11 Para saber mais: Import Esttico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483.12 Mais exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493.13 Discusso em aula: testes so importantes? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

    4 Trabalhando com XML 504.1 Os dados da bolsa de valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504.2 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514.3 Lendo XML com Java de maneira difcil, o SAX . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

    i

  • 4.4 XStream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554.5 Exerccios: Lendo o XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574.6 Separando as candles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604.7 Test Driven Design - TDD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614.8 Exerccios: Separando os candles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624.9 Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664.10 Discusso em aula: Onde usar XML e o abuso do mesmo . . . . . . . . . . . . . . . . . . . . . . 68

    5 Interfaces grcas com Swing 695.1 Interfaces grcas em Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695.2 Portabilidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695.3 Look And Feel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705.4 Componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715.5 Comeando com Swing - Mensagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715.6 Exerccios: Escolhendo o XML com JFileChooser . . . . . . . . . . . . . . . . . . . . . . . . . . 725.7 Componentes: JFrame, JPanel e JButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735.8 O design pattern Composite: Component e Container . . . . . . . . . . . . . . . . . . . . . . . 745.9 Tratando eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755.10 Classes internas e annimas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765.11 Exerccios: nossa primeira tela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775.12 JTable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815.13 Implementando um TableModel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815.14 Exerccios: Tabela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835.15 Exerccios opcionais: melhorando a apresentao . . . . . . . . . . . . . . . . . . . . . . . . . . 865.16 Para saber mais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885.17 Discusso em sala de aula: Listeners como classes top level, internas ou annimas? . . . . . . 89

    6 Refatorao: os Indicadores da bolsa 906.1 Anlise Tcnica da bolsa de valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 906.2 Indicadores Tcnicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 916.3 As mdias mveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926.4 Exerccios: criando indicadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 956.5 Refatorao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 986.6 Exerccios: Primeiras refatoraes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1006.7 Refatoraes maiores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036.8 Discusso em aula: quando refatorar? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

    7 Grcos com JFreeChart 1047.1 JFreeChart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1047.2 Utilizando o JFreeChart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1057.3 Isolando a API do JFreeChart: baixo acoplamento . . . . . . . . . . . . . . . . . . . . . . . . . . 1077.4 Para saber mais: Design Patterns Factory Method e Builder . . . . . . . . . . . . . . . . . . . . 1097.5 Exerccios: JFreeChart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

    ii

  • 7.6 Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1127.7 Nossos indicadores e o design pattern Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1137.8 Exerccios: refatorando para uma interface e usando bem os testes . . . . . . . . . . . . . . . . 1157.9 Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

    8 Mais Swing: layout managers, mais componentes e detalhes 1208.1 Gerenciadores de Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1208.2 Layout managers mais famosos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1228.3 Exerccios: usando layout managers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1238.4 Integrando JFreeChart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1268.5 Exerccios: completando a tela da nossa aplicao . . . . . . . . . . . . . . . . . . . . . . . . . . 1268.6 Indicadores mais Elaborados e o Design Pattern Decorator . . . . . . . . . . . . . . . . . . . . . 1298.7 Exerccios: Indicadores mais espertos e o Design Pattern Decorator . . . . . . . . . . . . . . . 1318.8 Discusso em sala de aula: uso de IDEs para montar a tela . . . . . . . . . . . . . . . . . . . . . 133

    9 Reection e Annotations 1349.1 Por que Reection? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1349.2 Class, Field e Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1359.3 Usando anotaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1369.4 Usar JTables difcil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1379.5 Usando bem anotaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1379.6 Criando sua prpria anotao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1409.7 Exerccios: ArgentumTableModel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1419.8 Exerccios opcionais: nomes das colunas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1439.9 Para saber mais: Formatter, printf e String.format . . . . . . . . . . . . . . . . . . . . . . . . . . 1449.10 Para saber mais: parmetros opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1459.11 Exerccios opcionais: formataes na tabela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1459.12 Discusso em sala de aula: quando usar reection, anotaes e interfaces . . . . . . . . . . . . 146

    10 Apndice: O processo de Build: Ant e Maven 14710.1 O processo de build . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14710.2 O Ant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14710.3 Exerccios com Ant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14810.4 O Maven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14910.5 O Project Object Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15010.6 Plugins, goals e phases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15110.7 Exerccios: build com o Maven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15110.8 Uso dentro do Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15510.9 Discusso em sala de aula: IDE, ant ou Maven? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

    11 Apndice - Mais swing e recursos avanados 15611.1 Input de dados formatados: Datas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15611.2 Exerccios opcionais: ltrando por data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

    iii

  • 11.3 Para saber mais: barra de menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16011.4 Exerccio: escolhendo indicadores para o grco . . . . . . . . . . . . . . . . . . . . . . . . . . . 16111.5 Diculdades comreads e concorrncia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16311.6 SwingWorker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16411.7 Exerccios: pesquisando mais na API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

    12 Apndice - Logging com Log4j 16612.1 Usando logs - LOG4J . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16612.2 Nveis de logs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16712.3 Appenders e layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16712.4 Exerccios: Adicionando logging com Log4J . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16812.5 O sl4j . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

    ndice Remissivo 169Verso: 15.6.17

    iv

  • Captulo 1

    Tornando-se um desenvolvedor pragmtico

    Na maioria dos casos, as pessoas, inclusive os fascnoras, so muito mais ingnuas e simples do quecostumamos achar. Alis, ns tambm.

    Fiodr Dostoievski, em Irmos Karamazov

    Por que fazer esse curso?

    1.1 O que realmente importante?

    Voc j passou pelo FJ-11 e, quem sabe, at pelo FJ-21. Agora chegou a hora de codicar bastante para pegaros truques e hbitos que so os grandes diferenciais do programador Java experiente.

    Pragmtico aquele que se preocupa com as questes prticas, menos focado em ideologias e tentandocolocar a teoria pra andar.

    Esse curso tem como objetivo trazer uma viso mais prtica do desenvolvimento Java atravs de uma experi-ncia rica em cdigo, onde exercitaremos diversas APIS e recursos do Java. Vale salientar que as bibliotecasem si no so os pontosmais importantes do aprendizado nestemomento, mas sim as boas prticas, a culturae um olhar mais amplo sobre o design da sua aplicao.

    Os design patterns, as boas prticas, a refatorao, a preocupao com o baixo acoplamento, os testes de uni-dade (tambm conhecidos como testes unitrios) e as tcnicas de programao (idiomismos) so passadoscom anco.

    Para atingir tal objetivo, esse curso baseia-se fortemente em artigos, blogs e, em especial, na literatura que seconsagrou como fundamental para os desenvolvedores Java. Aqui citamos alguns desses livros:

    http://blog.caelum.com.br/2006/09/22/livros-escolhendo-a-trindade-do-desenvolvedor-java/

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    Somamos a esses mais dois livros, que sero citados no decorrer do curso, e inuenciaram muito na elabo-rao do contedo que queremos transmitir a vocs. Todos os cinco so:

    Eective Java, Joshua Bloch Livro de um dos principais autores das maiores bibliotecas do Java SE(como o java.io e o java.util), arquiteto chefe Java naGoogle atualmente. Aqui elemostra como enfren-tar os principais problemas e limitaes da linguagem. Uma excelente leitura, dividido em mais de 70tpicos de 2 a 4 pginas cada, em mdia. Entre os casos interessantes est o uso de factory methods, osproblemas da herana e do protected, uso de colees, objetos imutveis e serializao, muitos dessesabordados e citados aqui no curso.

    DesignPatterns, ErichGamma et alLivro de ErichGamma, pormuito tempo lder do projeto Eclipsena IBM, e mais outros trs autores, o que justica terem o apelido de Gang of Four (GoF). Uma ex-celente leitura, mas cuidado: no saia lendo o catlogo dos patterns decorando-os, mas concentre-seespecialmente em ler toda a primeira parte, onde eles revelam um dos princpios fundamentais daprogramao orientada a objetos:Evite herana, prera composio e Programe voltado s interfacese no implementao.

    Refactoring, Martin Fowler Livro do cientista chefe daoughtWorks. Um excelente catlogo decomo consertar pequenas falhas do seu cdigo de maneira sensata. Exemplos clssicos so o uso deherana apenas por preguia, uso do switch em vez de polimorsmo, entre dezenas de outros. Duranteo curso, faremos diversos refactoring clssicos utilizando do Eclipse, muito mais que o bsico rename.

    Pragmatic Programmer, AndrewHunt Asmelhores prticas para ser um bomdesenvolvedor: desdeo uso de versionamento, ao bom uso do logging, debug, nomenclaturas, como consertar bugs, etc.

    e mythical man-month, Frederick Brooks Um livro que fala dos problemas que encontramosno dia a dia do desenvolvimento de soware, numa abordagem mais gerencial. Aqui h, inclusive, oclssico artigo No Silver Bullet, que arma que nunca haver uma soluo nica (uma linguagem,um mtodo de desenvolvimento, um sistema operacional) que se adeque sempre a todos os tipos deproblema.

    1.2 A importncia dos exerccios

    um tanto desnecessrio debater sobre a importncia de fazer exerccios, porm neste curso especco elesso vitais: como ele focado em boas prticas, alguma parte da teoria no est no texto - e passado nodecorrer de exerccios.

    No se assuste, h muito cdigo aqui nesse curso, onde vamos construir uma pequena aplicao que l umXML com dados da bolsa de valores e plota o grco de candlesticks, utilizando diversas APIs do Java SE eat mesmo bibliotecas externas.

    Captulo 1 - Tornando-se um desenvolvedor pragmtico - A importncia dos exerccios - Pgina 2

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    1.3 Tirando dvidas e referncias

    Para tirar dvidas dos exerccios, ou de Java em geral, recomendamos o frum do site do GUJ (http://www.guj.com.br/), onde sua dvida ser respondida prontamente.

    Fora isso, sinta-se vontade para entrar em contato com seu instrutor e tirar todas as dvidas que tiverdurante o curso.

    Voc pode estar interessado no livro TDD no mundo real, da editora Casa do Cdigo:

    http://www.tddnomundoreal.com.br/

    1.4 Para onde ir depois?

    Se voc se interessou pelos testes, design e automao, recomendamos os cursos online de testes da Caelum:

    http://www.caelum.com.br/curso/online/testes-automatizados/

    O FJ-21 indicado para ser feito antes ou depois deste curso, dependendo das suas necessidades e do seuconhecimento. Ele o curso que apresenta o desenvolvimento Web com Java e seus principais ferramentase frameworks.

    Depois destes cursos, que constituem a Formao Java da Caelum, indicamos dois outros cursos, da Forma-o Avanada:

    http://www.caelum.com.br/curso/formacao-java-avancada/

    O FJ-25 aborda Hibernate e JPA 2 e o FJ-26 envolve JSF 2, Facelets e CDI. Ambos vo passar por tecnologiashoje bastante utilizadas no desenvolvimento server side para web, e j na verso do Java EE 6.

    Captulo 1 - Tornando-se um desenvolvedor pragmtico - Tirando dvidas e referncias - Pgina 3

  • Captulo 2

    Omodelo da bolsa de valores, datas e objetosimutveis

    Primeiro aprenda cincia da computao e toda a teoria. Depois desenvolva um estilo de programao. E aesquea tudo e apenas hackeie."

    George Carrette

    O objetivo do FJ-16 aprender boas prticas da orientao a objetos, do design de classes, uso correto dosdesign patterns, princpios de prticas geis de programao e a importncia dos testes de unidade.

    Dois livros que so seminais na rea sero referenciados por diversas vezes pelo instrutor e pelo material:Eective Java, do Joshua Bloch, e Design Patterns: Elements of Reusable Object-Oriented Soware, de ErichGamma e outros (conhecido Gang of Four).

    2.1 A bolsa de valores

    Poucas atividades humanas exercem tanto fascnio quanto o mercado de aes, assunto abordado exaus-tivamente em lmes, livros e em toda a cultura contempornea. Somente em novembro de 2007, o totalmovimentado pela BOVESPA foi de R$ 128,7 bilhes. Destes, o volume movimentado por aplicaes homebroker foi de R$ 22,2 bilhes.

    Neste curso, abordaremos esse assunto que, hoje em dia, chega a ser cotidiano desenvolvendo uma aplicaoque interpreta os dados de um XML, trata e modela eles em Java e mostra grcos pertinentes.

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    2.2 Candlesticks: O Japo e o arroz

    Yodoya Keian era um mercador japons do sculo 17. Ele se tornou rapidamente muito rico, dadas as suashabilidades de transporte e precicao do arroz, uma mercadoria em crescente produo em consumo nopas. Sua situao social de mercador no permitia que ele fosse to rico dado o sistema de castas da poca e,logo, o governo conscou todo seu dinheiro e suas posses. Depois dele, outros vieram e tentaram escondersuas origens como mercadores: muitos tiveram seus lhos executados e seu dinheiro conscado.

    Apesar da triste histria, foi em Dojima, no jardim do prprio Yodoya Keian, que nasceu a bolsa de arrozdo Japo. L eram negociados, precicados e categorizados vrios tipos de arroz. Para anotar os preos doarroz, desenhava-se guras no papel. Essas guras parecem muito com velas -- da a analogia candlestick.

    Esses desenhos eram feitos em um papel feito de... arroz! Apesar de usado a sculos, o mercado ocidental sse interessou pela tcnica dos candlesticks recentemente, no ltimo quarto de sculo.

    Um candlestick indica 4 valores: o maior preo do dia, o menor preo do dia (as pontas), o primeiro preodo dia e o ltimo preo do dia (conhecidos como abertura e fechamento, respectivamente).

    Os preos de abertura e fechamento so as linhas horizontais e dependem do tipo de candle: se for de alta, opreo de abertura embaixo; se for de baixa, em cima. Um candle de alta costuma ter cor azul ou brancae os de baixa costumam ser vermelhos ou pretos. Caso o preo no tenha se movimentado, o candle tem amesma cor que a do dia anterior.

    Para calcular as informaes necessrias para a construo de um Candlestick, so necessrios os dados detodos os negcios (trades) de um dia. Um negcio possui trs informaes: o preo pelo qual foi comprado,a quantidade de ativos e a data em que ele foi executado.

    Voc pode ler mais sobre a histria dos candles em: http://www.candlestickforum.com/PPF/Parameters/1_279_/candlestick.asp

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Candlesticks: O Japo e o arroz - Pgina 5

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    Apesar de falarmos que o Candlestick representa os principais valores de um dia, ele pode ser usado paraos mais variados intervalos de tempo: um candlestick pode representar 15 minutos, ou uma semana, depen-dendo se voc est analisando o ativo para curto, mdio ou longo prazo.

    2.3 O projeto Tail

    A idia do projeto Tail (Technical Analysis Indicator Library) nasceu quando um grupo de alunos da Uni-versidade de So Paulo procurou o professor doutor Alfredo Goldman para orient-los no desenvolvimentode um soware para o projeto de concluso de curso.

    Ele ento teve a idia de juntar ao grupo alguns alunos do mestrado atravs de um sistema de co-orientao,onde os mestrandos auxiliariam os graduandos na implementao, modelagem e metodologia do projeto.Somente ento o grupo deniu o tema: o desenvolvimento de um soware open source de anlise tcnicagrasta (veremos o que a anlise tcnica em captulos posteriores).

    O soware est disponvel no SourceForge:

    http://sourceforge.net/projects/tail/

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - O projeto Tail - Pgina 6

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    Essa ideia, ainda vaga, foi gradativamente tomando a forma do projeto desenvolvido. O grupo se reuniasemanalmente adaptando o projeto, atribuindo novas tarefas e objetivos. Os graduandos tiveram a oportu-nidade de trabalhar em conjunto com os mestrandos, que compartilharam suas experincias anteriores.

    Objetivos do projeto Tail:

    Implementar os componentes bsicos da anlise tcnica grasta: srie temporal, operaes de comprae venda e indicadores tcnicos;

    Implementar as estratgias de compra e venda mais utilizadas no mercado, assim como permitir orpido desenvolvimento de novas estratgias;

    Implementar um algoritmo genrico para determinar ummomento apropriado de compra e venda deum ativo, atravs da escolha da melhor estratgia aplicada a uma srie temporal;

    Permitir que o critrio de escolha da melhor estratgia seja trocado e desenvolvido facilmente;

    Criar relatrios que facilitem o estudo e a compreenso dos resultados obtidos pelo algoritmo;

    Criar uma interface grca, permitindo o uso das ferramentas implementadas de forma fcil, rpida ede simples entendimento, mas que no limite os recursos da biblioteca;

    Arquitetura orientada a objetos, com o objetivo de ser facilmente escalvel e de simples entendimento;

    Utilizar prticas de XP, adaptando-as conforme as necessidades do grupo.

    Manter a cobertura de testes superior a 90%;

    Analisar o funcionamento do sistema de co-orientao, com o objetivo estend-lo para projetos futu-ros.

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - O projeto Tail - Pgina 7

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    O Tail foi desenvolvido por Alexandre Oki Takinami, Carlos Eduardo Mansur, Mrcio Vinicius dos San-tos,iago Garuttiies, Paulo Silveira (mestre em Geometria Computacional pela USP e diretor da Cae-lum), JulianMonteiro (mestre em sistemas distribudos pela USP e doutor pelo INRIA, em Sophia Antipolis,Frana) e Danilo Sato (mestre em Metodologias geis pela USP e Lead Consultant naoughtWorks).

    Esse projeto foi a primeira parceria entre a Caelum e a USP, onde a Caelum patrocinou o trabalho de con-cluso de curso dos 4 graduandos, hoje todos formados.

    Caso tenha curiosidade voc pode acessar o CVS do projeto, utilizando o seguinte repositrio:

    http://tail.cvs.sourceforge.net/viewvc/tail/

    2.4 O projeto Argentum: modelando o sistema

    Oprojeto Tail bastante ambicioso. Tem centenas de recursos, em especial o de sugesto de quando comprare de quando vender aes. O interessante durante o desenvolvimento do projeto Tail foi que muitos dosbons princpios de orientao a objetos, engenharia de soware, design patterns e Programao eXtrema seencaixaram muito bem - por isso, nos inspiramos fortemente nele como base para o FJ-16.

    Queremos modelar diversos objetos do nosso sistema, entre eles teremos:

    Negocio - guardando preo, quantidade e data;

    Candlestick - guardando as informaes do Candle, alm do volume de dinheiro negociado;

    SerieTemporal - que guarda um conjunto de candles.

    Essas classes formaro a base do projeto que criaremos durante o treinamento, o Argentum (do latim, di-nheiro ou prata). As funcionalidades do sistema sero as seguintes:

    Resumir Negocios em Candlesticks.Nossa base sero os Negcios. Precisamos converter uma lista denegcios em uma lista de Candles.

    Converter Candlesticks em SerieTemporal.Dada uma lista de Candle, precisamos criar uma srietemporal.

    Utilizar indicadores tcnicosPara isso, implementar um pequeno framework de indicadores e criaralguns deles de forma a facilitar o desenvolvimento de novos.

    Gerar grcosEmbutveis e interativos na interface grca em Java, dos indicadores que criamos.

    Para comear a modelar nosso sistema, precisamos entender alguns recursos de design de classes que aindano foram discutidos no FJ-11. Entre eles podemos citar o uso da imutabilidade de objetos, uso de anotaese aprender a trabalhar e manipular datas usando a API do Java.

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - O projeto Argentum: modelando o sistema - Pgina 8

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    2.5 Trabalhando com dinheiro

    At agora, no paramos muito para pensar nos tipos das nossas variveis e j ganhamos o costume de auto-maticamente atribuir valores a variveis double. Essa , contudo, uma prtica bastante perigosa!

    O problema do double que no possvel especicar a preciso mnima que ele vai guardar e, dessa forma,estamos sujeitos a problemas de arredondamento ao fracionar valores e voltar a som-los. Por exemplo:

    double cem = 100.0;double tres = 3.0;double resultado = cem / tres;

    System.out.println(resultado);// 33.333?// 33.333333?// 33.3?

    Se no queremos correr o risco de acontecer um arredondamento sem que percebamos, a alternativa usara classe BigDecimal, que lana exceo quando tentamos fazer uma operao cujo resultado inexato.

    Leia mais sobre ela na prpria documentao do Java.

    2.6 Palavra chave final

    A palavra chave final tem vrias utilidades. Em uma classe, dene que a classe nunca poder ter uma lha,isso , no pode ser estendida. A classe String, por exemplo, final.

    Como modicador de mtodo, final indica que aquele mtodo no pode ser reescrito. Mtodos muitoimportantes costumam ser denidos assim. Claro que isso no necessrio declarar caso sua classe j sejafinal.

    Ao usarmos como modicador na declarao de varivel, indica que o valor daquela varivel nunca poderser alterado, uma vez atribudo. Se a varivel for um atributo, voc tem que inicializar seu valor durante aconstruo do objeto - caso contrrio, ocorre um erro de compilao, pois atributos final no so iniciali-zados com valores default.

    Imagine que, quando criamos um objeto Negocio, no queremos que seu valor seja modicado:

    class Negocio {

    private final double valor;

    // getters e setters?

    }

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Trabalhando com dinheiro - Pgina 9

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    Esse cdigo no compila, nem mesmo com um setter, pois o valor nal deveria j ter sido inicializado. Pararesolver isso, ou declaramos o valor do Negocio direto na declarao do atributo (o que no fazmuito sentidonesse caso), ou ento populamos pelo construtor:

    class Negocio {

    private final double valor;

    public Negocio(double valor) {this.valor = valor;

    }

    // podemos ter um getter, mas nao um setter aqui!

    }

    Uma varivel static final tem uma cara de constante daquela classe e, se for public static final, a pa-rece uma constante global! Por exemplo, na classe Collections do java.util existe uma constante publicstatic final chamada EMPTY_LIST. conveno que constantes sejam declaradas letras maisculas e sepa-radas por travesso (underscore) em vez de usar o padro camel case. Outros bons exemplos so o PI e o E,dentro da java.lang.Math.

    Isso muito utilizado, mas hoje no java 5 para criarmos constantes costuma ser muito mais interessanteutilizarmos o recurso de enumeraes que, alm de tipadas, j possuem diversos mtodos auxiliares.

    No caso da classe Negocio, no entanto, bastar usarmos atributos nais e tambmmarcarmos a prpria classecomo nal para que ela crie apenas objetos imutveis.

    2.7 Imutabilidade de objetos

    Effective Java

    Item 15: Minimize mutabilidade

    Para que uma classe seja imutvel, ela precisa ter algumas caractersticas:

    Nenhum mtodo pode modicar seu estado;

    A classe deve ser final;

    Os atributos devem ser privados;

    Os atributos devem ser final, apenas para legibilidade de cdigo, j que no h mtodos que modi-cam o estado do objeto;

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Imutabilidade de objetos - Pgina 10

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    Caso sua classe tenha composies com objetos mutveis, eles devem ter acesso exclusivo pela suaclasse.

    Diversas classes no Java so imutveis, como a String e todas as classes wrapper. Outro excelente exemplode imutabilidade so as classes BigInteger e BigDecimal:

    Qual seria a motivao de criar uma classe de tal maneira?

    Objetos podem compartilhar suas composies

    Como o objeto imutvel, a composio interna de cada um pode ser compartilhada entre eles, j que noh chances de algum deles mudar tais atributos. Esse compartilhamento educado possibilita fazer cache desuas partes internas, alm de facilitar a manipulao desses objetos.

    Isso pode ser encarado como o famoso design pattern Flyweight.

    fcil entender os benefcios dessa prtica quando olhamos para o caso da String: objetos do tipo Stringque contm exatamente o mesmo texto ou partes exatas do texto original (como no caso de usarmos osubstring) compartilham a array privada de chars!

    Na prtica, o que isso quer dizer que se voc tem uma String muito longa e cria vrias outras com trechosda original, voc no ter que armazenar os caracteres de novo para cada trecho: eles utilizaro o array dechars da String original!

    String palavra = "supercalifragilisticexpialidocious";String inicio = palavra.substring(0, 5);String proximas = palavra.substring(5, 10);String outras = palavra.substring(10, 15);String resto = palavra.substring(15);

    Esses objetos tambm so ideais para usar como chave de tabelas de hash.

    Thread safety

    Uma das principais vantagens da imutabilidade em relao a concorrncia. Simplesmente no precisamosnos preocupar em relao a isso: como no h mtodo que mude o estado do objeto, ento no h comofazer duas modicaes acontecerem concorrentemente!

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Imutabilidade de objetos - Pgina 11

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    Objetos mais simples

    Uma classe imutvel mais simples de dar manuteno. Como no h chances de seu objeto ser modicado,voc tem uma srie de garantias sobre o uso daquela classe.

    Se os construtores j abrangem todas as regras necessrias para validar o estado do objeto, no h preocupa-o em relao a manter o estado consistente, j que no h chances de modicao.

    Uma boa prtica de programao evitar tocar em variveis parmetros de um mtodo. Com objetos imu-tveis nem existe esse risco quando voc os recebe como parmetro.

    Se nossa classe Negocio imutvel, isso removemuitas dvidas emedos que poderamos ter durante o desen-volvimento do nosso projeto: saberemos em todos os pontos que os valores do negcio so sempre os mes-mos, no corremos o risco de ummtodo que constri o candlestickmexer nos nossos atributos (deixandoou no num estado inconsistente), alm de a imutabilidade tambm garantir que no haver problemas nocaso de acesso concorrente ao objeto.

    2.8 Trabalhando com datas: Date e Calendar

    Se voc fez o FJ-21 conosco, j teve que lidar com as converses entre Date e Calendar para pegar a entradade data de um texto digitado pelo usurio e convert-lo para um objeto que representa datas em Java.

    A classe mais antiga que representa uma data dentro do Java a Date. Ela armazena a data de forma cadamomento do tempo seja representado por um nmero - isso quer dizer, que o Date guarda todas as datascomo milissegundos que se passaram desde 01/01/1970.

    O armazenamento dessa forma no de todo ruim, mas o problema que a API no traz mtodos queajudem muito a lidar com situaes do dia como, por exemplo, adicionar dias ou meses a uma data.

    A classe Date no mais recomendada porque a maior parte de seus mtodos esto marcados comodeprecated, porm ela tem amplo uso legado nas bibliotecas do java. Ela foi substituda no Java 1.1 peloCalendar, para haver suporte correto internacionalizao e localizao do sistema de datas.

    Calendar: evoluo do Date

    A classe abstrata Calendar tambm encapsula um instante em milissegundos, como a Date, mas ela provmtodos para manipulao desse momento em termos mais cotidianos como dias, meses e anos. Por serabstrata, no entanto, no podemos criar objetos que so simplesmente Calendars.

    A subclasse concreta de Calendarmais usada a GregorianCalendar, que representa o calendrio usado pelamaior parte dos pases -- outras implementaes existem, como a do calendrio budista BuddhistCalendar,mas estas so bem menos usadas e devolvidas de acordo com seu Locale.

    Para obter um Calendar que encapsula o instante atual (data e hora), usamos o mtodo estticogetInstance() de Calendar.

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Trabalhando com datas: Date e Calendar - Pgina 12

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    Calendar agora = Calendar.getInstance();

    Porque no damos new diretamente em GregorianCalendar? A API do Java fornece esse mtodo estticoque fabrica um objeto Calendar de acordo com uma srie de regras que esto encapsuladas dentro degetInstance. Esse o padro de projeto factory, que utilizamos quando queremos esconder a maneira emque um objeto instanciado. Dessa maneira podemos trocar implementaes devolvidas como retorno amedida que nossas necessidades mudem.

    Nesse caso algum pas que use calendrios diferente do gregoriano pode implementar esse mtodo de ma-neira adequada, retornando o que for necessrio de acordo com o Locale congurado na mquina.

    Effective Java

    Item 1: Considere utilizar Factory com mtodos estticos em vez de construtores

    Repare ainda que h uma sobrecarga desse mtodo que recebe Locale ou Timezone como argumento, casovoc queira que essa factory trabalhe com valores diferentes dos valores que a JVM descobrir em relao aoseu ambiente.

    Um outro excelente exemplo de factory o DriverManager do java.sql que fabrica Connection de acordocom os argumentos passados.

    A partir de um Calendar, podemos saber o valor de seus campos, como ano, ms, dia, hora, minuto, etc.Para isso, usamos o mtodo get que recebe um inteiro representando o campo; os valores possveis esto emconstantes na classe Calendar.

    No exemplo abaixo, imprimimos o dia de hoje e o dia da semana correspondente. Note que o dia da semanadevolvido um inteiro que representa o dia da semana (Calendar.MONDAY etc):

    Calendar c = Calendar.getInstance();System.out.println("Dia do Ms: " + c.get(Calendar.DAY_OF_MONTH));System.out.println("Dia da Semana: " + c.get(Calendar.DAY_OF_WEEK));

    Um possvel resultado :

    Dia do Ms: 4Dia da Semana: 5

    No exemplo acima, o dia da semana 5 representa a quinta-feira.

    Da mesma forma que podemos pegar os valores dos campos, podemos atribuir novos valores a esses campospor meio dos mtodos set.

    H diversos mtodos set em Calendar. O mais geral o que recebe dois argumentos: o primeiro indica qual o campo (usando aquelas constantes de Calendar) e, o segundo, o novo valor. Alm desse mtodo, outros

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Trabalhando com datas: Date e Calendar - Pgina 13

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    mtodos set recebem valores de determinados campos; o set de trs argumentos, por exemplo, recebe ano,ms e dia. Vejamos um exemplo de como alterar a data de hoje:

    Calendar c = Calendar.getInstance();c.set(2011, Calendar.DECEMBER, 25, 10, 30);// mudamos a data para as 10:30am do Natal

    Outromtodo bastante usado add, que adiciona uma certa quantidade a qualquer campo do Calendar. Porexemplo, para uma aplicao de agenda, queremos adicionar um ano data de hoje:

    Calendar c = Calendar.getInstance();c.add(Calendar.YEAR, 1); // adiciona 1 ao ano

    Note que, embora o mtodo se chame add, voc pode us-lo para subtrair valores tambm; basta colocaruma quantidade negativa no segundo argumento.

    Os mtodos after e before so usados para comparar o objeto Calendar em questo a outro Calendar. Omtodo after devolver true quando o objeto atual do Calendar representar um momento posterior ao doCalendar passado como argumento. Por exemplo, after devolver false se compararmos o dia das crianascom o Natal, pois o dia das crianas no vem depois do Natal:

    Calendar c1 = new GregorianCalendar(2005, Calendar.OCTOBER, 12);Calendar c2 = new GregorianCalendar(2005, Calendar.DECEMBER, 25);System.out.println(c1.after(c2));

    Analogamente, o mtodo before verica se o momento em questo vem antes do momento do Calendarque foi passado como argumento. No exemplo acima, c1.before(c2) devolver true, pois o dia das crianasvem antes do Natal.

    Note que Calendar implementa Comparable. Isso quer dizer que voc pode usar o mtodo compareTo paracomparar dois calendrios. No fundo, after e before usam o compareTo para dar suas respostas - apenas,fazem tal comparao de uma forma mais elegante e encapsulada.

    Por ltimo, um dos problemas mais comuns quando lidamos com datas vericar o intervalo de dias entreduas datas que podem ser at de anos diferentes. O mtodo abaixo devolve o nmero de dias entre doisobjetos Calendar. O clculo feito pegando a diferena entre as datas em milissegundos e dividindo essevalor pelo nmero de milissegundos em um dia:

    public int diferencaEmDias(Calendar c1, Calendar c2) {long m1 = c1.getTimeInMillis();long m2 = c2.getTimeInMillis();return (int) ((m2 - m1) / (24*60*60*1000));

    }

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Trabalhando com datas: Date e Calendar - Pgina 14

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    RelacionandoDate e Calendar

    Voc pode pegar um Date de um Calendar e vice-versa atravs dos mtodos getTime e setTime presentes naclasse Calendar:

    Calendar c = new GregorianCalendar(2005, Calendar.OCTOBER, 12);Date d = c.getTime();c.setTime(d);

    Isso faz com que voc possa operar com datas da maneira nova, mesmo que as APIs ainda usem objetos dotipo Date (como o caso de java.sql).

    Para saber mais: ClassesDeprecated e o JodaTime

    O que fazer quando descobrimos que algum mtodo ou alguma classe no saiu bem do jeito que deveria?Simplesmente apag-la e criar uma nova?

    Essa uma alternativa possvel quando apenas o seu programa usa tal classe, mas denitivamente no umaboa alternativa se sua classe j foi usada por milhes de pessoas no mundo todo.

    o caso das classes do Java. Algumas delas (Date, por exemplo) so repensadas anos depois de serem lana-das e solues melhores aparecem (Calendar). Mas, para no quebrar compatibilidade com cdigos existen-tes, o Java mantm as funcionalidades problemticas ainda na plataforma, mesmo que uma soluo melhorexista.

    Mas comodesencorajar cdigos novos a usarem funcionalidades antigas e nomais recomendadas? Aprticano Java para isso marc-las como deprecated. Isso indica aos programadores que no devemosmais us-lase que futuramente, em uma versomais nova do Java, podem sair da API (embora isso nunca tenha ocorridona prtica).

    Antes do Java 5, para falar que algo era deprecated, usava-se um comentrio especial no Javadoc. A partirdo Java 5, a anotao @Deprecated foi adicionada plataforma e garante vericaes do prprio compilador(que gera um warning). Olhe o Javadoc da classe Date para ver tudo que foi deprecated.

    A API de datas do Java, mesmo considerando algumas melhorias da Calendar em relao a Date, ainda muito pobre. Numa prxima verso novas classes para facilitar ainda mais o trabalho com datas e horriosdevem entrar na especicao do Java, baseadas na excelente biblioteca JodaTime.

    Para mais informaes: http://blog.caelum.com.br/2007/03/15/jsr-310-date-and-time-api/ http://jcp.org/en/jsr/detail?id=310

    2.9 Exerccios: o modelo do Argentum

    1) Vamos criar o projeto fj-16-argentum no Eclipse, j com o foco em usar a IDE melhor: use o atalho ctrl+ N, que cria novo... e comece a digitar Java Project:

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Exerccios: o modelo do Argentum - Pgina 15

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    2) Na janela que abrir em sequncia, preencha o nome do projeto como 916-argentum e clique em Next:

    3) Na prxima tela, podemos denir uma srie de conguraes do projeto (que tambm podem ser feitasdepois, atravs do menu Build path -> Congure build path, clicando com o boto da direita no projeto.

    Queremos mudar o diretrio que conter nosso cdigo fonte. Faremos isso para organizar melhor nossoprojeto e utilizar convenes amplamente utilizadas no mercado.

    Nessa tela, remova o diretrio src da lista de diretrios fonte:

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Exerccios: o modelo do Argentum - Pgina 16

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    Agora, na mesma tela, adicione um novo diretrio fonte, chamado src/main/java. Para isso, clique emCreate new source folder e preencha com src/main/java:

    4) Agora basta clicar em Finish. A estrutura nal de seu projeto deve estar parecida com isso:

    5) Crie a classe usando ctrl + N Class, chamada Negocio e dentro do pacote br.com.caelum.argentum:

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Exerccios: o modelo do Argentum - Pgina 17

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    6) Transforme a classe em nal e j declare os trs atributos que fazem parte de uma negociao da bolsa devalores (tambm como nal):

    public final class Negocio {private final double preco;private final int quantidade;private final Calendar data;

    }

    No esquea de importar o Calendar!

    7) Vamos criar um construtor que recebe esses dados, j que so obrigatrios para nosso domnio. Em vezde fazer isso na mo, na edio da classe, use o atalho ctrl + 3 e comece a digitar constructor. Ele vaimostrar uma lista das opes que contm essa palavra: escolha a Generate constructor using elds.

    Alternativamente, tecle ctrl + 3 e digite GCUF, que so as iniciais do menu que queremos acessar.

    Agora, selecione todos os campos e marque para omitir a invocao ao super, como na tela abaixo.

    Ateno para deixar os campos na ordem preco, quantidade, data. Voc pode usar os botes Up eDown para mudar a ordem.

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Exerccios: o modelo do Argentum - Pgina 18

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    Pronto! Mande gerar. O seguinte cdigo que ser gerado:

    public Negocio(double preco, int quantidade, Calendar data) {this.preco = preco;this.quantidade = quantidade;this.data = data;

    }

    8) Agora, vamos gerar os getters dessa classe. Faa ctrl + 3 e comece a digitar getter, as opes aparecero ebasta voc escolher generate getters and setters. sempre bom praticar os atalhos do ctrl + 3.

    Selecione os getters e depois Finish:

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Exerccios: o modelo do Argentum - Pgina 19

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    9) Verique sua classe. Ela deve estar assim:

    public final class Negocio {

    private final double preco;private final int quantidade;private final Calendar data;

    public Negocio(double preco, int quantidade, Calendar data) {this.preco = preco;this.quantidade = quantidade;this.data = data;

    }

    public double getPreco() {return preco;

    }

    public int getQuantidade() {return quantidade;

    }

    public Calendar getData() {return data;

    }}

    10) Um dado importante para termos noo da estabilidade de uma ao na bolsa de valores o volume dedinheiro negociado em um perodo.

    Vamos fazer nossa classe Negocio devolver o volume de dinheiro transferido naquela negociao. Na pr-tica, s multiplicar o preco pago pela quantidade de aes negociadas, resultando no total de dinheiroque aquela negociao realizou.

    Adicione o mtodo getVolume na classe Negocio:

    public double getVolume() {return preco * quantidade;

    }

    Repare que ummtodo que parece ser um simples getter pode (e deve muitas vezes) encapsular regras denegcio e no necessariamente reetem um atributo da classe.

    11) Siga o mesmo procedimento para criar a classe Candlestick. Use o ctrl + N Class para isso, marque-acomo nal e adicione os seguintes atributos nais, nessa ordem:

    public final class Candlestick {private final double abertura;

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Exerccios: o modelo do Argentum - Pgina 20

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    private final double fechamento;private final double minimo;private final double maximo;private final double volume;private final Calendar data;

    }

    12) Use o ctrl + 3 para gerar o construtor com os seis atributos. Ateno ordem dos parmetros no cons-trutor:

    13) Gere tambm os seis respectivos getters, usando o ctrl + 3.

    A classe nal deve car parecida com a que segue:

    1 public final class Candlestick {2 private final double abertura;3 private final double fechamento;4 private final double minimo;5 private final double maximo;6 private final double volume;7 private final Calendar data;8

    9 public Candlestick(double abertura,double fechamento,double minimo,10 double maximo, double volume, Calendar data) {11 this.abertura = abertura;12 this.fechamento = fechamento;13 this.minimo = minimo;14 this.maximo = maximo;15 this.volume = volume;

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Exerccios: o modelo do Argentum - Pgina 21

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    16 this.data = data;17 }18

    19 public double getAbertura() {20 return abertura;21 }22 public double getFechamento() {23 return fechamento;24 }25 public double getMinimo() {26 return minimo;27 }28 public double getMaximo() {29 return maximo;30 }31 public double getVolume() {32 return volume;33 }34 public Calendar getData() {35 return data;36 }37 }

    14) (opcional) Vamos adicionar dois mtodos de negcio, para que o Candlestick possa nos dizer se ele dotipo de alta, ou se de baixa:

    public boolean isAlta() {return this.abertura < this.fechamento;

    }

    public boolean isBaixa() {return this.abertura > this.fechamento;

    }

    2.10 Resumo dirio dos negcios

    Agora que temos as classes que representam negociaes na bolsa de valores (Negocio) e resumos diriosdessas negociaes (Candlestick), falta apenas fazer a ao de resumir os negcios de umdia emuma candle.

    A regra um tanto simples: dentre uma lista de negociaes, precisamos descobrir quais so os valores apreencher na Candlestick:

    Abertura: preo da primeira negociao do dia;

    Fechamento: preo da ltima negociao do dia;

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Resumo dirio dos negcios - Pgina 22

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    Mnimo: preo da negociao mais barata do dia;

    Mximo: preo da negociao mais cara do dia;

    Volume: quantidade de dinheiro que passou em todas as negociaes nesse dia;

    Data: a qual dia o resumo se refere.

    Algumas dessas informaes so fceis de encontrar por que temos uma conveno no sistema: quandovamos criar a candle, a lista de negcios j vem ordenada por tempo. Dessa forma, a abertura e o fechamentoso triviais: basta recuperar o preo , respectivamente, da primeira e da ltima negociaes do dia!

    J mnimo, mximo e volume precisam que todos os valores sejam vericados. Dessa forma, precisamospassar por cada negcio da lista vericando se aquele valor menor do que todos os outros que j vimos,maior que nosso mximo atual. Aproveitando esse processo de passar por cada negcio, j vamos somandoo volume de cada negociao.

    O algoritmo, agora, est completamente especicado! Basta passarmos essas idias para cdigo. Para isso,lembremos, voc pode usar alguns atalhos que j vimos antes:

    Ctrl + N: cria novo(a)...

    Ctrl + espao: autocompleta

    Ctrl + 1: resolve pequenos problemas de compilao e atribui objetos a variveis.

    Em que classe colocar?

    Falta apenas, antes de pr em prtica o que aprendemos, decidirmos onde vai esse cdigo de criao deCandlestick. Pense bem a respeito disso: ser que um negcio deveria saber resumir vrios de si em umacandle? Ou ser que uma Candlestick deveria saber gerar um objeto do prprio tipo Candlestick a partir deuma lista de negcios.

    Em ambos os cenrios, nossos modelos tm que ter informaes a mais que, na realidade, so responsabili-dades que no cabem a eles!

    Criaremos, ento, uma classe que: dado a matria-prima, nos constri uma candle. E uma classe com essecomportamento, que recebem o necessrio para criar um objeto e encapsulam o algoritmo para tal criao,costuma ser chamadas de Factory.

    No nosso caso particular, essa uma fbrica que cria Candlesticks, ento, seu nome caCandlestickFactory.

    Perceba que esse nome, apesar de ser um tal Design Pattern nada mais faz do que encapsular uma lgica umpouco mais complexa, isto , apenas aplica boas prticas de orientao a objetos que voc j vem estudandodesde o FJ-11.

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Resumo dirio dos negcios - Pgina 23

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    2.11 Exerccios: fbrica de Candlestick

    1) Como o resumo de Negocios em um Candlestick um processo complicado, vamos encapsular suaconstruo atravs de uma fbrica, assim como vimos a classe Calendar, porm o mtodo de fabricaocar numa classe a parte, o que tambm muito comum. Vamos criar a classe CandlestickFactorydentro do pacote br.com.caelum.argentum.reader:

    Depois de cri-la, adicione a assinatura do mtodo constroiCandleParaData como abaixo:

    public class CandlestickFactory {// ctrl + 1 para adicionar o return automaticamentepublic Candlestick constroiCandleParaData(Calendar data,

    List negocios) {

    }}

    2) Calcularemos o preo mximo e mnimo percorrendo todos os negcios e achando os valores corretos.Para isso, usaremos variveis temporrias e, dentro do for, vericaremos se o preo do negcio atual bateoumximo. Se no bater, veremos se ele menor que omnimo. Calculamos o volume somando o volumede cada negcio em uma varivel:

    volume += negocio.getVolume();

    if (negocio.getPreco() > maximo) {maximo = negocio.getPreco();

    } else if (negocio.getPreco() < minimo) {minimo = negocio.getPreco();

    }

    Podemos pegar o preo de abertura atravs de negocios.get(0) e o de fechamento pornegocios.get(negocios.size() - 1).

    1 public class CandlestickFactory {2 public Candlestick constroiCandleParaData(Calendar data,3 List negocios) {

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Exerccios: fbrica de Candlestick - Pgina 24

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    4 double maximo = negocios.get(0).getPreco();5 double minimo = negocios.get(0).getPreco();6 double volume = 0;7

    8 // digite foreach e d um ctrl + espao para ajudar a9 // criar o bloco abaixo!10 for (Negocio negocio : negocios) {11 volume += negocio.getVolume();12

    13 if (negocio.getPreco() > maximo) {14 maximo = negocio.getPreco();15 } else if (negocio.getPreco() < minimo) {16 minimo = negocio.getPreco();17 }18 }19

    20 double abertura = negocios.get(0).getPreco();21 double fechamento = negocios.get(negocios.size()-1).getPreco();22

    23 return new Candlestick(abertura, fechamento, minimo, maximo,24 volume, data);25 }26 }

    3) Vamos testar nosso cdigo, criando 4 negcios e calculando o Candlestick, nalmente. Crie a classeTestaCandlestickFactory no pacote br.com.caelum.argentum.testes

    1 public class TestaCandlestickFactory {2

    3 public static void main(String[] args) {4 Calendar hoje = Calendar.getInstance();5

    6 Negocio negocio1 = new Negocio(40.5, 100, hoje);7 Negocio negocio2 = new Negocio(45.0, 100, hoje);8 Negocio negocio3 = new Negocio(39.8, 100, hoje);9 Negocio negocio4 = new Negocio(42.3, 100, hoje);10

    11 List negocios = Arrays.asList(negocio1, negocio2,12 negocio3, negocio4);13

    14 CandlestickFactory fabrica = new CandlestickFactory();15 Candlestick candle = fabrica.constroiCandleParaData(16 hoje, negocios);17

    18 System.out.println(candle.getAbertura());19 System.out.println(candle.getFechamento());

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Exerccios: fbrica de Candlestick - Pgina 25

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    20 System.out.println(candle.getMinimo());21 System.out.println(candle.getMaximo());22 System.out.println(candle.getVolume());23 }24 }

    O mtodo asList da classe java.util.Arrays cria uma lista dada uma array. Mas no passamosnenhuma array como argumento! Isso acontece porque esse mtodo aceita varargs, possibilitando queinvoquemos esse mtodo separando a array por vrgula. Algo parecido com um autoboxing de arrays.

    Effective Java

    Item 47: Conhea e use as bibliotecas!

    A sada deve ser parecida com:

    40.542.339.845.016760.0

    2.12 Exerccios opcionais

    1)Effective Java

    Item 10: Sempre reescreva o toString

    Reescreva o toString da classe Candlestick. Como o toString da classe Calendar retorna umaString bastante complexa, faa com que a data seja corretamente visualizada, usando para isso oSimpleDateFormat. Procure sobre essa classe na API do Java.

    Ao imprimir um candlestick, por exemplo, a sada deve ser algo como segue:

    [Abertura 40.5, Fechamento 42.3, Mnima 39.8, Mxima 45.0,Volume 145234.20, Data 12/07/2008]

    Para reescrever um mtodo e tirar proveito do Eclipse, a maneira mais direta de dentro da classeCandlestick, fora de qualquer mtodo, pressionar ctrl + espao.

    Uma lista com todas as opes de mtodos que voc pode reescrever vai aparecer. Escolha o toString, eao pressionar enter o esqueleto da reescrita ser montado.

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Exerccios opcionais - Pgina 26

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    2) Um double segue uma regra bemdenida em relao a contas e arredondamento, e para ser rpido e caberem 64 bits, no tem preciso innita. A classe BigDecimal pode oferecer recursos mais interessantes emum ambiente onde as casas decimais so valiosas, como um sistema nanceiro. Pesquise a respeito.

    3) O construtor da classe Candlestick simplesmentemuito grande. Poderamos usar uma factory, pormcontinuaramos passando muitos argumentos para um determinado mtodo.

    Quando construir um objeto complicado, ou confuso, costumamos usar o padro Builder para resolverisso. Builder uma classe que ajudar voc a construir um determinado objeto em uma srie de passos,independente de ordem.

    Effective Java

    Item 2: Considere usar um builder se o construtor tiver muitos parmetros!

    A ideia que possamos criar um candle da seguinte maneira:

    CandleBuilder builder = new CandleBuilder();

    builder.comAbertura(40.5);builder.comFechamento(42.3);builder.comMinimo(39.8);builder.comMaximo(45.0);builder.comVolume(145234.20);builder.comData(new GregorianCalendar(2012, 8, 12, 0, 0, 0));

    Candlestick candle = builder.geraCandle();

    Os setters aqui possuem nomes mais curtos e expressivos. Mais ainda: utilizando o padro de projetouent interface, podemos tornar o cdigo acima mais conciso, sem perder a legibilidade:

    Candlestick candle = new CandleBuilder().comAbertura(40.5).comFechamento(42.3).comMinimo(39.8).comMaximo(45.0).comVolume(145234.20).comData(new GregorianCalendar(2008, 8, 12, 0, 0, 0)).geraCandle();

    Para isso, a classe CandleBuilder deve usar o seguinte idiomismo:

    public class CandleBuilder {

    private double abertura;// outros 5 atributos

    public CandleBuilder comAbertura(double abertura) {this.abertura = abertura;

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Exerccios opcionais - Pgina 27

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    return this;}

    // outros 5 setters que retornam this

    public Candlestick geraCandle() {return new Candlestick(abertura, fechamento, minimo, maximo,

    volume, data);}

    }

    Escreva um cdigo com main que teste essa sua nova classe. Repare como o builder parece bastante coma StringBuilder, que uma classe builder que ajuda a construir Strings atravs de uent interface emtodos auxiliares.

    Usos famosos de Fluent Interface eDSLs

    Fluent interfaces so muito usadas no Hibernate, por exemplo. O jQuery, uma famosa bibliotecade efeitos javascript, popularizou-se por causa de sua uent interface. O JodaTime e o JMock sodois excelentes exemplos.

    Somuito usadas (e recomendadas) na construo deDSLs, Domain Specic Languages. MartinFowler fala bastante sobre uent interfaces nesse timo artigo:

    http://martinfowler.com/bliki/FluentInterface.html

    Captulo 2 - O modelo da bolsa de valores, datas e objetos imutveis - Exerccios opcionais - Pgina 28

  • Captulo 3

    Testes Automatizados

    Apenas duas coisas so innitas: o universo e a estupidez humana. E eu no tenho certeza do primeiro. Albert Eistein

    3.1 Nosso cdigo est funcionando corretamente?

    Escrevemos uma quantidade razovel de cdigo no captulo anterior, meia dzia de classes. Elas funcionamcorretamente? Tudo indica que sim, at criamos um pequeno main para vericar isso e fazer as perguntascorretas.

    Pode parecer que o cdigo funciona, mas ele temmuitas falhas. Olhemos com mais cuidado.

    3.2 Exerccios: testando nosso modelo sem frameworks

    1) Ser que nosso programa funciona para um determinado dia que ocorrer apenas um nico negcio?Vamos escrever o teste, e ver o que acontece:

    1 public class TestaCandlestickFactoryComUmNegocioApenas {2

    3 public static void main(String[] args) {4 Calendar hoje = Calendar.getInstance();5

    6 Negocio negocio1 = new Negocio(40.5, 100, hoje);7

    8 List negocios = Arrays.asList(negocio1);9

    10 CandlestickFactory fabrica = new CandlestickFactory();

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    11 Candlestick candle = fabrica.constroiCandleParaData(hoje, negocios);12

    13 System.out.println(candle.getAbertura());14 System.out.println(candle.getFechamento());15 System.out.println(candle.getMinimo());16 System.out.println(candle.getMaximo());17 System.out.println(candle.getVolume());18 }19 }

    A sada deve indicar 40.5 como todos os valores, e 4050.0 como volume. Tudo parece bem?

    2) Mais um teste: as aes menos negociadas podem car dias sem nenhuma operao acontecer. O quenosso sistema gera nesse caso?

    Vamos ao teste:

    1 public class TestaCandlestickFactorySemNegocios {2

    3 public static void main(String[] args) {4 Calendar hoje = Calendar.getInstance();5

    6 List negocios = Arrays.asList();7

    8 CandlestickFactory fabrica = new CandlestickFactory();9 Candlestick candle = fabrica.constroiCandleParaData(hoje, negocios);10

    11 System.out.println(candle.getAbertura());12 System.out.println(candle.getFechamento());13 System.out.println(candle.getMinimo());14 System.out.println(candle.getMaximo());15 System.out.println(candle.getVolume());16 }17 }

    Rodando o que acontece? Voc acha essa sada satisfatria? Indica bem o problema?

    3) ArrayIndexOutOfBoundsException certamente uma pssima exceo para indicar que no teremosCandle.

    Captulo 3 - Testes Automatizados - Exerccios: testando nosso modelo sem frameworks - Pgina 30

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    Qual deciso vamos tomar? Podemos lanar nossa prpria exception, podemos retornar null ou aindapodemos devolver um Candlestick que possui um signicado especial. Devolver null deve ser semprea ltima opo.

    Vamos retornar um Candlestick que possui um volume zero. Para corrigir o erro, vamos alterar o cdigodo nosso CandlestickFactory.

    Poderamos usar um if logo de cara para vericar se negocios.isEmpty(), porm podemos tentar algomais sutil, sem ter que criar vrios pontos de return.

    Vamos ento iniciar os valores de minimo e maximo sem usar a lista, que pode estar vazia. Mas, paranosso algoritmo funcionar, precisaramos iniciar o minimo com um valor bem grande, assim quandopercorrermos o for qualquer valor j vai ser logo minimo. Mesmo com maximo, que deve ter um valorbem pequeno.

    Mas quais valores colocar? Quanto um nmero pequeno o suciente? Ou um nmero grande o su-ciente? Na classe Double, encontramos constantes que representam os maiores e menores nmeros exis-tentes.

    Altere o mtodo constroiCandleParaData da classe CandlestickFactory:

    double maximo = Double.MIN_VALUE;double minimo = Double.MAX_VALUE;

    Alm disso, devemos vericar se negocios est vazio na hora de calcular o preo de abertura efechamento. Altere novamente o mtodo:

    double abertura = negocios.isEmpty() ? 0 : negocios.get(0).getPreco();double fechamento = negocios.isEmpty() ? 0 :

    negocios.get(negocios.size() - 1).getPreco();

    Pronto! Rode o teste, deve vir tudo zero e nmeros estranhos para mximo e mnimo!

    4) Ser que tudo est bem? Rode novamente os outros dois testes, o que acontece?

    Incrvel! Consertamos um bug, mas adicionamos outro. A situao lhe parece familiar? Ns desenvolve-dores vivemos com isso o tempo todo: tentando fugir dos velhos bugs que continuam a reaparecer!

    O teste com apenas um negcio retorna 1.7976931348623157E308 como valor mnimo agora! Mas deveriaser 40.5. Ainda bem que lembramos de rodar essa classe, e que percebemos que esse nmero est diferentedo que deveria ser.

    Vamos sempre conar em nossa memria?

    5) (opcional) Ser que esse erro est ligado a ter apenas um negcio? Vamos tentar commais negcios? Criee rode um teste com os seguintes negocios:

    Negocio negocio1 = new Negocio(40.5, 100, hoje);Negocio negocio2 = new Negocio(45.0, 100, hoje);

    Captulo 3 - Testes Automatizados - Exerccios: testando nosso modelo sem frameworks - Pgina 31

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    Negocio negocio3 = new Negocio(49.8, 100, hoje);Negocio negocio4 = new Negocio(53.3, 100, hoje);

    E com uma sequncia descrescente, funciona? Por qu?

    3.3 Definindo melhor o sistema e descobrindo mais bugs

    Segue uma lista de dvidas pertinentes ao Argentum. Algumas dessas perguntas voc no saber respon-der, porque no denimos muito bem o comportamento de alguns mtodos e classes. Outras voc saberresponder.

    De qualquer maneira, crie um cdigo curto para testar cada uma das situaes, em um main apropriado.

    1) Uma negociao da Petrobrs a 30 reais, com uma quantidade negativa de negcios vlida? E comnmero zero de negcios?

    Em outras palavras, posso dar new em um Negocio com esses dados?

    2) Uma negociao com data nula vlida? Posso dar new Negocio(10, 5, null)? Deveria poder?

    3) Um candle realmente imutvel? No podemos mudar a data de um candle de maneira alguma?

    4) Um candle em que o preo de abertura igual ao preo de fechamento, um candle de alta ou de baixa?O que o sistema diz? O que o sistema deveria dizer?

    5) Como geramos um candle de um dia que no houve negcios? O que acontece?

    6) E se a ordem dos negcios passadas ao CandlestickFactory no estiver na ordem crescente das datas?Devemos aceitar? No devemos?

    7) E se esses Negocios forem de dias diferentes que a data passada como argumento para a factory?

    3.4 Testes deUnidade

    Testes de unidade so testes que testam apenas uma classe ou mtodo, vericando se seu comportamentoest de acordo com o desejado. Em testes de unidade, vericamos a funcionalidade da classe e/ou mtodoem questo passando o mnimo possvel por outras classes ou dependncias do nosso sistema.

    Unidade

    Unidade a menor parte testvel de uma aplicao. Em uma linguagem de programao orien-tada a objetos como o Java, a menor unidade um mtodo.

    O termo correto para esses testes testes de unidade, porm o termo teste unitrio propagou-see o mais encontrado nas tradues.

    Captulo 3 - Testes Automatizados - Denindo melhor o sistema e descobrindo mais bugs - Pgina 32

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    Em testes de unidade, no estamos interessados no comportamento real das dependncias da classe, mas emcomo a classe em questo se comporta diante das possveis respostas das dependncias, ou ento se a classemodicou as dependncias da maneira esperada.

    Para isso, quando criamos um teste de unidade, simulamos a execuo de mtodos da classe a ser testada.Fazemos isso passando parmetros (no caso de ser necessrio) ao mtodo testado e denimos o resultadoque esperamos. Se o resultado for igual ao que denimos como esperado, o teste passa. Caso contrrio, falha.

    Ateno

    Muitas vezes, principalmente quando estamos iniciandonomundodos testes, comumcriarmosalguns testes que testam muito mais do que o necessrio, mais do que apenas a unidade. Taistestes se transformam em verdadeiros testes de integrao (esses sim so responsveis por testaro sistemas como um todo).

    Portanto, lembre-se sempre: testes de unidade testam apenas unidades!

    3.5 JUnit

    O JUnit (junit.org) um framework muito simples para facilitar a criao destes testes de unidade e emespecial sua execuo. Ele possui alguns mtodos que tornam seu cdigo de teste bem legvel e fcil de fazeras asseres.

    Uma assero uma armao: alguma invariante que em determinado ponto de execuo voc quer ga-rantir que verdadeira. Se aquilo no for verdade, o teste deve indicar uma falha, a ser reportada para oprogramador, indicando um possvel bug.

    medida que vocmexe no seu cdigo, voc roda novamente toda aquela bateria de testes comum comandoapenas. Com isso voc ganha a conana de que novos bugs no esto sendo introduzidos (ou reintrodu-zidos) conforme voc cria novas funcionalidades e conserta antigos bugs. Mais fcil do que ocorre quandofazemos os testes dentro do main, executando um por vez.

    O JUnit possui integrao com todas as grandes IDEs, alm das ferramentas de build, que vamos conhecermais a frente. Vamos agora entender um pouco mais sobre anotaes e o import esttico, que vo facilitarmuito o nosso trabalho com o JUnit.

    Usando o JUnit - configurando Classpath e seu JAR no Eclipse

    O JUnit uma biblioteca escrita por terceiros que vamos usar no nosso projeto. Precisamos das classes doJUnit para escrever nossos testes. E, como sabemos, o formato de distribuio de bibliotecas Java o JAR,muito similar a um ZIP com as classes daquela biblioteca.

    Precisamos ento do JAR do JUnit no nosso projeto. Mas quando rodarmos nossa aplicao, como o Java vaisaber que deve incluir as classes daquele determinado JAR junto com nosso programa? (dependncia)

    Captulo 3 - Testes Automatizados - JUnit - Pgina 33

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    aqui que oClasspath entra histria: nele que denimos qual o caminho para buscar as classes que vamosusar. Temos que indicar onde a JVM deve buscar as classes para compilar e rodar nossa aplicao.

    H algumas formas de congurarmos o classpath:

    Congurando uma varivel de ambiente (desaconselhado);

    Passando como argumento em linha de comando (trabalhoso);

    Utilizando ferramentas como Ant e Maven (veremos mais a frente);

    Deixando o eclipse congurar por voc.

    No Eclipse, muito simples:

    1) Clique com o boto direito em cima do nome do seu projeto.

    2) Escolha a opo Properties.

    3) Na parte esquerda da tela, selecione a opo Java Build Path.

    E, nessa tela:

    1) Java Build Path onde voc congura o classpath do seu projeto: lista de locais denidos que, porpadro, s vm com a mquina virtual congurada;

    2) Opes para adicionar mais caminhos, Add JARs... adiciona Jars que estejam no seu projeto; AddExternal JARs adiciona Jars que estejam em qualquer outro lugar da mquina, porm guardar umareferncia para aquele caminho (ento seu projeto poder no funcionar corretamente quando colocadoem outro micro, mas existe como utilizar variveis para isso);

    No caso do JUnit, por existir integrao direta com Eclipse, o processo ainda mais fcil, como veremos noexerccio. Mas para todas as outras bibliotecas que formos usar, basta copiar o JAR e adicion-lo ao BuildPath. Vamos ver esse procedimento com detalhes quando usarmos as bibliotecas que trabalham com XMLe grcos em captulos posteriores.

    3.6 Anotaes

    Anotao a maneira de escrever metadados na prpria classe, isto , conguraes ou outras informaespertinentes a essa classe. Esse recurso foi introduzido no Java 5.0. Algumas anotaes podem ser mantidas(retained) no .class, permitindo que possamos reaver essas informaes, se necessrio.

    utilizada, por exemplo, para indicar que determinada classe deve ser processada por um framework deuma certa maneira, evitando assim as clssicas conguraes atravs de centenas de linhas de XML.

    Apesar dessa propriedade interessante, algumas anotaes servem apenas para indicar algo ao compilador.@Override o exemplo disso. Caso voc use essa anotao em um mtodo que no foi reescrito, vai haverum erro de compilao! A vantagem de us-la apenas para facilitar a legibilidade.

    Captulo 3 - Testes Automatizados - Anotaes - Pgina 34

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    @Deprecated indica que ummtodo no deve ser mais utilizado por algummotivo e decidiram no retir-loda API para no quebrar programas que j funcionavam anteriormente.

    @SurpressWarnings indica para o compilador que ele no deve dar warnings a respeito de determinadoproblema, indicando que o programador sabe o que est fazendo. Um exemplo owarning que o compiladordo Eclipse d quando voc no usa determinada varivel. Voc vai ver que um dos quick xes a sugestode usar o @SupressWarnings.

    Anotaes podem receber parmetros. Existem muitas delas na API do java 5, mas realmente ainda maisutilizada em frameworks, como o Hibernate 3, o EJB 3 e o JUnit4.

    3.7 JUnit4, convenes e anotao

    Para cada classe, teremos uma classe correspondente (por conveno, com o suxo Test) que contar todosos testes relativos aos mtodos dessa classe. Essa classe car no pacote de mesmo nome, mas na SourceFolder de testes (src/test/java).

    Por exemplo, para a nossa CandlestickFactory, teremos a CandlestickFactoryTest:

    package br.com.caelum.argentum.reader

    public class CandlestickFactoryTest {

    public void sequenciaSimplesDeNegocios() {Calendar hoje = Calendar.getInstance();

    Negocio negocio1 = new Negocio(40.5, 100, hoje);Negocio negocio2 = new Negocio(45.0, 100, hoje);Negocio negocio3 = new Negocio(39.8, 100, hoje);Negocio negocio4 = new Negocio(42.3, 100, hoje);

    List negocios = Arrays.asList(negocio1, negocio2, negocio3,negocio4);

    CandlestickFactory fabrica = new CandlestickFactory();Candlestick candle = fabrica.constroiCandleParaData(hoje, negocios);

    }}

    Emvez de um main, criamos ummtodo comnome expressivo para descrever a situao que ele est testando.Mas... como o JUnit saber que deve executar aquele mtodo? Para isso anotamos este mtodo com @Test,que far com que o JUnit saiba no momento de execuo, por reection, de que aquele mtodo deva serexecutado:

    Captulo 3 - Testes Automatizados - JUnit4, convenes e anotao - Pgina 35

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    public class CandlestickFactoryTest {

    @Testpublic void sequenciaSimplesDeNegocios() {

    // ...}

    }

    Pronto! Quando rodarmos essa classe como sendo um teste do JUnit, esse mtodo ser executado e a Viewdo JUnit no Eclipse mostrar se tudo ocorreu bem. Tudo ocorre bem quando o mtodo executado semlanar excees inesperadas e se todas as asseres passarem.

    Uma assero uma vericao. Ela realizada atravs dos mtodos estticos da classe Assert, importadado org.junit. Por exemplo, podemos vericar se o valor de abertura desse candle 40.5:

    Assert.assertEquals(40.5, candle.getAbertura(), 0.00001);

    Oprimeiro argumento o que chamamos de expected, e ele representa o valor que esperamos para argumentoseguinte (chamado de actual). Se o valor real for diferente do esperado, o teste no passar e uma barrinhavermelha ser mostrada, juntamente com uma mensagem que diz:

    expected but was

    Double inexato

    Logo na primeira discusso desse curso, conversamos sobre a inexatido do double ao trabalhar com arre-dondamentos. Porm, diversas vezes, gostaramos de comparar o double esperado e o valor real, sem nospreocupar com diferenas de arredondamento quando elas somuito pequenas.

    O JUnit trata esse caso adicionando um terceiro argumento, que s necessrio quando comparamos valoresdouble ou oat. Ele um delta que se aceita para o erro de comparao entre o valor esperado e o real.

    Por exemplo, quando lidamos com dinheiro, o que nos importa so as duas primeiras casas decimais e,portanto, no h problemas se o erro for na quinta casa decimal. Em sowares de engenharia, no entanto,um erro na quarta casa decimal pode ser um grande problema e, portanto, o delta deve ser ainda menor.

    Nosso cdigo nal do teste, agora com as devidas asseres, car assim:

    1 public class CandlestickFactoryTest {2

    3 @Test4 public void sequenciaSimplesDeNegocios() {5 Calendar hoje = Calendar.getInstance();6

    7 Negocio negocio1 = new Negocio(40.5, 100, hoje);

    Captulo 3 - Testes Automatizados - JUnit4, convenes e anotao - Pgina 36

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    8 Negocio negocio2 = new Negocio(45.0, 100, hoje);9 Negocio negocio3 = new Negocio(39.8, 100, hoje);10 Negocio negocio4 = new Negocio(42.3, 100, hoje);11

    12 List negocios = Arrays.asList(negocio1, negocio2, negocio3,13 negocio4);14

    15 CandlestickFactory fabrica = new CandlestickFactory();16 Candlestick candle = fabrica.constroiCandleParaData(hoje, negocios);17

    18 Assert.assertEquals(40.5, candle.getAbertura(), 0.00001);19 Assert.assertEquals(42.3, candle.getFechamento(), 0.00001);20 Assert.assertEquals(39.8, candle.getMinimo(), 0.00001);21 Assert.assertEquals(45.0, candle.getMaximo(), 0.00001);22 Assert.assertEquals(1676.0, candle.getVolume(), 0.00001);23 }24 }

    Existem ainda outras anotaes principais e mtodos importantes da classe Assert, que conheceremos nodecorrer da construo do projeto.

    3.8 Exerccios: migrando os testes do main para JUnit

    1) considerada boa prtica separar as classes de testes das classes principais. Para isso, normalmente secria um novo source folder apenas para os testes. Vamos fazer isso:

    a) Ctrl + N e comece a digitar Source Folder at que o ltro a encontre:

    b) Preencha com src/test/java e clique Finish:

    Captulo 3 - Testes Automatizados - Exerccios: migrando os testes do main para JUnit - Pgina 37

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    nesse novo diretrio em que voc colocar todos seus testes de unidade.

    2) Vamos criar um novo unit test em cima da classe CandlestickFactory. O Eclipse j ajuda bastante: como editor na CandlestickFactory, crie um novo (ctrl + N) JUnit Test Case.

    Na janela seguinte, selecione o source folder como src/test/java. No esquea, tambm, de selecionarJUnit4.

    Ao clicar em Finish, o Eclipse te perguntar se pode adicionar os jars do JUnit no projeto.

    Captulo 3 - Testes Automatizados - Exerccios: migrando os testes do main para JUnit - Pgina 38

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    A anotao @Test indica que aquele mtodo deve ser executado na bateria de testes, e a classe Assert pos-sui uma srie de mtodos estticos que realizam comparaes, e no caso de algum problema um exceo lanada.

    Vamos colocar primeiro o teste inicial:

    1 public class CandlestickFactoryTest {2

    3 @Test4 public void sequenciaSimplesDeNegocios() {5 Calendar hoje = Calendar.getInstance();6

    7 Negocio negocio1 = new Negocio(40.5, 100, hoje);8 Negocio negocio2 = new Negocio(45.0, 100, hoje);9 Negocio negocio3 = new Negocio(39.8, 100, hoje);10 Negocio negocio4 = new Negocio(42.3, 100, hoje);11

    12 List negocios = Arrays.asList(negocio1, negocio2, negocio3,13 negocio4);14

    15 CandlestickFactory fabrica = new CandlestickFactory();16 Candlestick candle = fabrica.constroiCandleParaData(hoje, negocios);17

    18 Assert.assertEquals(40.5, candle.getAbertura(), 0.00001);19 Assert.assertEquals(42.3, candle.getFechamento(), 0.00001);20 Assert.assertEquals(39.8, candle.getMinimo(), 0.00001);21 Assert.assertEquals(45.0, candle.getMaximo(), 0.00001);22 Assert.assertEquals(1676.0, candle.getVolume(), 0.00001);23 }24 }

    Para rodar, use qualquer um dos seguintes atalhos:

    ctrl + F11: roda o que estiver aberto no editor;

    alt + shi + X (solte) T: roda testes do JUnit.

    Captulo 3 - Testes Automatizados - Exerccios: migrando os testes do main para JUnit - Pgina 39

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    No se assuste! Houve a falha porque o nmero esperado do volume est errado no teste. Repare queo Eclipse j associa a falha para a linha exata da assero e explica porque falhou:

    O nmero correto mesmo 16760.0. Adicione esse zero na classe de teste e rode-o novamente:

    comum digitarmos errado no teste e o teste falhar, por isso, importante sempre vericar a corretudedo teste, tambm!

    3) Vamos adicionar outro mtodo de teste mesma classe CandlestickFactoryTest, dessa vez para testaro mtodo no caso de no haver nenhum negcio:

    1 @Test2 public void semNegociosGeraCandleComZeros() {3 Calendar hoje = Calendar.getInstance();4

    5 List negocios = Arrays.asList();6

    Captulo 3 - Testes Automatizados - Exerccios: migrando os testes do main para JUnit - Pgina 40

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    7 CandlestickFactory fabrica = new CandlestickFactory();8 Candlestick candle = fabrica.constroiCandleParaData(hoje, negocios);9

    10 Assert.assertEquals(0.0, candle.getVolume(), 0.00001);11 }

    Rode o teste com o mesmo atalho.

    4) E, agora, vamos para o que tem apenas um negcio e estava falhando. Ainda na classeCandlestickFactoryTest adicione o mtodo: (repare que cada classe de teste possui vrios mtodoscom vrios casos diferentes)

    1 @Test2 public void apenasUmNegocioGeraCandleComValoresIguais() {3 Calendar hoje = Calendar.getInstance();4

    5 Negocio negocio1 = new Negocio(40.5, 100, hoje);6

    7 List negocios = Arrays.asList(negocio1);8

    9 CandlestickFactory fabrica = new CandlestickFactory();10 Candlestick candle = fabrica.constroiCandleParaData(hoje, negocios);11

    12 Assert.assertEquals(40.5, candle.getAbertura(), 0.00001);13 Assert.assertEquals(40.5, candle.getFechamento(), 0.00001);14 Assert.assertEquals(40.5, candle.getMinimo(), 0.00001);15 Assert.assertEquals(40.5, candle.getMaximo(), 0.00001);16 Assert.assertEquals(4050.0, candle.getVolume(), 0.00001);17 }

    Rode o teste. Repare no erro:

    Captulo 3 - Testes Automatizados - Exerccios: migrando os testes do main para JUnit - Pgina 41

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    Como consertar?

    3.9 Vale a pena testar classes de modelo?

    Faz todo sentido testar classes como a CandlestickFactory, j que existe um algoritmo nela, alguma lgicaque deve ser executada e h uma grande chance de termos esquecido algum comportamento para casosincomuns - como vimos nos testes anteriores.

    Mas as classes de modelo, Negocio e Candlestick, tambm precisam ser testadas?

    A resposta para essa pergunta um grande e sonoro sim! Apesar de serem classes mais simples elas tambmtm comportamentos especcos como:

    1) as classes Negocio e Candlestick devem ser imutveis, isto , no devemos ser capazes de alterar ne-nhuma de suas informaes depois que o objeto criado;

    2) valores negativos tambm no deveriam estar presentes nos negcios e candles;

    3) se voc fez o opcional CandleBuilder, ele no deveria gerar a candle se os valores no tiverem sido preen-chidos;

    4) etc...

    Por essa razo, ainda que sejam classes mais simples, elas merecem ter sua integridade testada - mesmoporque so os objetos que representam nosso modelo de negcios, o corao do sistema que estamos desen-volvendo.

    Captulo 3 - Testes Automatizados - Vale a pena testar classes de modelo? - Pgina 42

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    3.10 Exerccios: novos testes

    1) A classe Negocio realmente imutvel?

    Vamos criar um novo Unit Test para a classe Negocio. O processo o mesmo que zemos para o teste daCandlestickFactory: abra a classe Negocio no editor e faa Ctrl + N JUnit Test Case.

    Lembre-se de alterar a Source Folder para src/test/java e selecionar o JUnit 4.

    1 public class NegocioTest {2

    3 @Test4 public void dataDoNegocioEhImutavel() {5 // se criar um negocio no dia 15...6 Calendar c = Calendar.getInstance();7 c.set(Calendar.DAY_OF_MONTH, 15);8 Negocio n = new Negocio(10, 5, c);9

    10

    11 // ainda que eu tente mudar a data para 20...12 n.getData().set(Calendar.DAY_OF_MONTH, 20);13

    14 // ele continua no dia 15.15 Assert.assertEquals(15, n.getData().get(Calendar.DAY_OF_MONTH));16 }17 }

    Voc pode rodar esse teste apenas, usando o atalho (alt + shi + X T) ou pode fazer melhor e o que maiscomum, rodar todos os testes de unidade de um projeto.

    Basta selecionar o projeto na View Package Explorer e mandar rodar os testes: para essa ao, o nicoatalho possvel o alt + shift + X T.

    Captulo 3 - Testes Automatizados - Exerccios: novos testes - Pgina 43

  • Material do Treinamento Laboratrio Java com Testes, XML e Design Patterns

    Esse teste falha porque devolvemos um objeto mutvel atravs de um getter. Deveramos ter retornadouma cpia desse objeto para nos assegurarmos que o original permanece intacto.

    Effective Java

    Item 39: Faa cpias defensivas quando necessrio.

    Basta alterar a classe Negocio e utilizar o mtodo clone que todos os objetos tm (mas s quem imple-menta Cloneable executar com xito):

    public Calendar getData() {return (Calendar) this.data.clone();

    }