caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

Upload: juniormad

Post on 29-Oct-2015

507 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    1/189

    Cursos Caelum

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    2/189

    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

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    3/189

    Conhea alguns de nossos cursos

    FJ-11:Java e Orientao aobjetos

    FJ-26:

    Laboratrio Web com JSF2 eCDI

    FJ-16:

    Laboratrio Java com Testes,XML e Design Patterns

    FJ-19:

    Preparatrio para Certificaode Programador Java

    FJ-21:Java para Desenvolvimento

    Web

    FJ-31:

    Java EE avanado eWeb Services

    FJ-91:Arquitetura e Design de

    Projetos Java

    RR-71:

    Desenvolvimento gil para Web2.0 com Ruby on Rails

    RR-75:

    Ruby e Rails avanados: lidandocom problemas do dia a dia

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

    FJ-25:Persistncia com JPA2 eHibernate

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    4/189

    Sobre esta apostilaEsta apostila da Caelum visa ensinar de uma maneira 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, JSF, Web Services e DesignPatterns e distribudo gratuitamente exclusivamente pelo site da Caelum. Todos os direitos so reservados Caelum. A distribuio, cpia, revenda e utilizao para ministrar treinamentos so absolutamente vedadas.Para uso comercial deste material, por favor, consulte a Caelum previamente.

    www.caelum.com.br

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    5/189

    Sumrio

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

    O modelo da bolsa de valores, datas e objetos imutveis . A bolsa de valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Candlesticks: O Japo e o arroz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    . O projeto Tail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . O projeto Argentum: modelando o sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Trabalhando com dinheiro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Palavra chave nal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Imutabilidade de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Trabalhando com datas: Date e Calendar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios: o modelo do Argentum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resumo dirio das Negociaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios: fbrica de Candlestick. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    . Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    Testes Automatizados . Nosso cdigo est funcionando corretamente? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios: testando nosso modelo sem frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . Denindo melhor o sistema e descobrindo mais bugs . . . . . . . . . . . . . . . . . . . . . . . . . Testes de Unidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Anotaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JUnit, convenes e anotao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    . Exerccios: migrando os testes do main para JUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . Vale a pena testar classes de modelo? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios: novos testes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Para saber mais: Import Esttico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mais exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Discusso em aula: testes so importantes? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    Trabalhando com XML . Os dados da bolsa de valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    . O formato XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lendo XML com Java de maneira difcil, o SAX . . . . . . . . . . . . . . . . . . . . . . . . . . .

    i

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    6/189

    . XStream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios: Lendo o XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Discusso em aula: Onde usar XML e o abuso do mesmo . . . . . . . . . . . . . . . . . . . . . .

    Test Driven Design - TDD . Separando as candles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vantagens do TDD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios: Identicando negociaes do mesmo dia . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios: Separando os candles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    Acessando um Web Service . Integrao entre sistemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    . Consumindo dados de um Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Criando o cliente Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios: Nosso cliente Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Discusso em aula: Como testar o cliente do web service? . . . . . . . . . . . . . . . . . . . . .

    Introduo ao JSF e Primefaces . Interfaces grcas para o usurio - GUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . O cliente gordo e o desenvolvimento Desktop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . O desenvolvimento Web e o protocolo HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mesclar desenvolvimento Desktop e Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Especicao e implementao do JSF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introduo ao JSF com Mojarra e PrimeFaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preparao do ambiente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios: Instalando o Tomcat e criando o projeto . . . . . . . . . . . . . . . . . . . . . . . . . . A primeira pgina com JSF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios: Os primeiros componentes JSF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listagem de Negociaes com Primefaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cdigo atrs da tela - Managed Beans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formatao de Data com JSF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    . Paginao e Ordenao das negociaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios: p:dataTable para listar as Negociaes do Web Service . . . . . . . . . . . . . . . . . . O Padro Model View Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    Refatorao: os Indicadores da bolsa . Anlise Tcnica da bolsa de valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Indicadores Tcnicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . As mdias mveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios: criando indicadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Refatorao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios: Primeiras refatoraes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    ii

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    7/189

    . Refatoraes maiores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Discusso em aula: quando refatorar? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    Grcos interativos com Primefaces . Por que usar grcos? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exemplos de Grcos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilizando o Primefaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Propriedades para personalizar o grco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Denio do modelo do grco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Isolando a API do Primefaces: baixo acoplamento . . . . . . . . . . . . . . . . . . . . . . . . . . . Para saber mais: Design Patterns Factory Method e Builder . . . . . . . . . . . . . . . . . . . . . Exerccios: Grcos com Primefaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    Aplicando Padres de projeto . Nossos indicadores e o design pattern Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios: refatorando para uma interface e usando bem os testes . . . . . . . . . . . . . . . . . Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Indicadores mais Elaborados e o Design Pattern Decorator . . . . . . . . . . . . . . . . . . . . . . Exerccios: Indicadores mais espertos e o Design Pattern Decorator . . . . . . . . . . . . . . .

    Formulrios com JSF . Melhorando a Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Componentes de entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Submetendo o formulrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Validao com JSF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Organizao dos componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios: Executando lgica e validando entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . ComboBox para selecionar os indicadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios: Completando o Formulrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    API de Reection . Montando os indicadores dinamicamente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    . Introduo a Reection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Por que Reection? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Constructor, Field e Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Melhorando nosso ArgentumBean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccios: Plotando indicadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    Apndice Testes de interface com Selenium . Introduo ao teste de aceitao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Como funciona? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Trabalhando com diversos testes de aceitao . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    . Para saber mais: Congurando o Selenium em casa . . . . . . . . . . . . . . . . . . . . . . . . .

    iii

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    8/189

    . Exerccios: Teste com Selenium . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    ndice Remissivo

    Verso: ..

    iv

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    9/189

    C

    Tornando-se um desenvolvedor pragmtico

    Na maioria dos casos, as pessoas, inclusive os facnoras, so muito mais ingnuas e simples do que

    costumamos achar. Alis, ns tambm.

    Fiodr Dostoivski, em Irmos Karamazov

    Por que fazer esse curso?

    . O

    Voc j passou pelo FJ- e, quem sabe, at pelo FJ-. 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 pontos mais importantes do aprendizado neste momento, 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////livros-escolhendo-a-trindade-do-desenvolvedor-java/

    http://blog.caelum.com.br/2006/09/22/livros-escolhendo-a-trindade-do-desenvolvedor-java/http://blog.caelum.com.br/2006/09/22/livros-escolhendo-a-trindade-do-desenvolvedor-java/
  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    10/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services 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 na Google atualmente. Aqui ele mostra como enfren-tar os principais problemas e limitaes da linguagem. Uma excelente leitura, dividido em mais de tpicos de a 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.

    Design Patterns, Erich Gamma et al Livro de Erich Gamma, por muito 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-se

    especialmente 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 da oughtWorks. Um excelente catlogo decomo consertar pequenas falhas do seu cdigo de maneira sensata. Exemplos clssicos so o uso deherana apenas por preguia,usodo 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, Andrew Hunt As melhores prticas para ser um bom desenvolvedor: 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.

    . A

    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 - Tornando-se um desenvolvedor pragmtico - A importncia dos exerccios - Pgina

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    11/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    . T

    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/

    . P

    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- 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/formacao-java-avancada/

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

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

    http://www.guj.com.br/http://www.guj.com.br/http://www.tddnomundoreal.com.br/http://www.caelum.com.br/curso/online/testes-automatizados/http://www.caelum.com.br/formacao-java-avancada/http://www.caelum.com.br/formacao-java-avancada/http://www.caelum.com.br/curso/online/testes-automatizados/http://www.tddnomundoreal.com.br/http://www.guj.com.br/http://www.guj.com.br/
  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    12/189

    C

    O modelo da bolsa de valores, datas e objetosimutveis

    Primeiro aprenda cincia da computao e toda a teoria. Depois desenvolva um estilo de programao. E a

    esquea tudo e apenas hackeie."

    George Carrette

    O objetivo do FJ- 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).

    . A

    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 , o totalmovimentado pela BOVESPA foi de R , bilhes. Destes, o volume movimentado por aplicaes homebrokerfoi de R , 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.

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    13/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    . C: O J

    Yodoya Keian era um mercador japons do sculo . 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 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 as negociaes (trades) de um dia. Uma Negociao possui trs informaes: o preo pelo qual foicomprado, 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/__/candlestick.asp

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

    http://www.candlestickforum.com/PPF/Parameters/1_279_/candlestick.asphttp://www.candlestickforum.com/PPF/Parameters/1_279_/candlestick.asphttp://www.candlestickforum.com/PPF/Parameters/1_279_/candlestick.asphttp://www.candlestickforum.com/PPF/Parameters/1_279_/candlestick.asp
  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    14/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services 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 minutos, ou uma semana, depen-dendo se voc est analisando o ativo para curto, mdio ou longo prazo.

    . O T

    A ideia 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 ideia de juntar ao grupo alguns alunos do mestrado atravs de um sistema de coorientao,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 - O modelo da bolsa de valores, datas e objetos imutveis - O projeto Tail - Pgina

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    15/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services 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 um momento 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 ;

    Analisar o funcionamento do sistema de coorientao, com o objetivo estend-lo para projetos futuros.

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

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    16/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    O Tail foi desenvolvido por Alexandre Oki Takinami, Carlos Eduardo Mansur, Mrcio Vinicius dos San-tos, iago Garutti ies, Paulo Silveira (mestre em Geometria Computacional pela USP e diretor da Cae-

    lum), Julian Monteiro (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 na oughtWorks).

    Esse projeto foi a primeira parceria entre a Caelum e a USP, onde a Caelum patrocinou o trabalho de con-cluso de curso dos 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/

    . O A:

    O projeto 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-.

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

    Negociao - 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 Negociacoes em Candlesticks.Nossa base sero as negociaes. Precisamos converter umalista de negociaes 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-. 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 - O modelo da bolsa de valores, datas e objetos imutveis - O projeto Argentum: modelando o sistema - Pgina

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    17/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    . T

    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.

    . P

    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 poder

    ser 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 Negociacao, no queremos que seu valor seja modicado:

    class Negociacao {

    private final double valor;

    // getters e setters?

    }

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

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    18/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services 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 da Negociacao direto na declarao do atributo (o que no faz muito

    sentido nesse caso), ou ento populamos pelo construtor:

    class Negociacao {

    private final double valor;

    public Negociacao(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 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 Negociacao, no entanto, bastar usarmos atributos nais e tambm marcarmos a prpriaclasse como nal para que ela crie apenas objetos imutveis.

    . I

    E J

    Item : 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 - O modelo da bolsa de valores, datas e objetos imutveis - Imutabilidade de objetos - Pgina

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    19/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services 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?

    O

    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 arrayprivada 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.

    T

    Uma das principais vantagens da imutabilidade em relao a concorrncia. Simplesmente no precisamos

    nos preocupar em relao a isso: como no h mtodo que mude o estado do objeto, ento no h comofazer duas modicaes acontecerem concorrentemente!

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

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    20/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    O

    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 Negociacao imutvel, isso remove muitas dvidas e medos que poderamos ter durante odesenvolvimento do nosso projeto: saberemos em todos os pontos que os valores da negociao so sempre

    os mesmos, no corremos o risco de um mtodo que constri o candlestick mexer nos nossos atributos(deixando ou no num estado inconsistente), alm de a imutabilidade tambm garantir que no haver pro-blemas no caso de acesso concorrente ao objeto.

    . T : D C

    Se voc fez o FJ- 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 //.

    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 . peloCalendar, para haver suporte correto internacionalizao e localizao do sistema de datas.

    C: D

    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 Calendar maisusadaa 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 - O modelo da bolsa de valores, datas e objetos imutveis - Trabalhando com datas: Date e Calendar - Pgina

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    21/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services 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.

    E J

    Item : 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 factorytrabalhe 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: 4

    Dia da Semana: 5

    No exemplo acima, o dia da semana 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 - O modelo da bolsa de valores, datas e objetos imutveis - Trabalhando com datas: Date e Calendar - Pgina

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    22/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services 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

    Outro mtodo 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,poisodiadascrianasvem 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 - O modelo da bolsa de valores, datas e objetos imutveis - Trabalhando com datas: Date e Calendar - Pgina

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    23/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    R D C

    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).

    P : C D JT

    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 como desencorajarcdigos novos a usarem funcionalidades antigas e no mais recomendadas? A prticano Java para isso marc-las como deprecated. Isso indica aos programadores que no devemos mais us-lase que futuramente, em uma verso mais nova do Java, podem sair da API (embora isso nunca tenha ocorridona prtica).

    Antes do Java , para falar que algo era deprecated, usava-se um comentrio especial no Javadoc. A partirdo Java , 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////jsr--date-and-time-api/ http://jcp.org/en/jsr/detail?id=

    . E: A

    ) Vamos criar o projeto fj22-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 - O modelo da bolsa de valores, datas e objetos imutveis - Exerccios: o modelo do Argentum - Pgina

    http://blog.caelum.com.br/2007/03/15/jsr-310-date-and-time-api/http://jcp.org/en/jsr/detail?id=310http://jcp.org/en/jsr/detail?id=310http://jcp.org/en/jsr/detail?id=310http://jcp.org/en/jsr/detail?id=310http://blog.caelum.com.br/2007/03/15/jsr-310-date-and-time-api/
  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    24/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

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

    ) 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 - O modelo da bolsa de valores, datas e objetos imutveis - Exerccios: o modelo do Argentum - Pgina

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    25/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services 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:

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

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

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    26/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    ) Crie a classe usando ctrl + N Class, chamada Negociacao e dentro do pacotebr.com.caelum.argentum.modelo:

    ) 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 Negociacao {

    private final double preco;

    private final int quantidade;

    private final Calendar data;

    }

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

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    27/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    No esquea de importar o Calendar!

    ) Vamos criar um construtor que recebe esses dados, j que so obrigatrios para nosso domnio. Em vez

    de fazer isso na mo, na edio da classe, use o atalho ctrl + e comece a digitar constructor. Ele vaimostrar uma lista das opes que contm essa palavra: escolha a Generate constructor using elds.

    Alternativamente, tecle ctrl + 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.

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

    public Negociacao(double preco, int quantidade, Calendar data) {

    this.preco = preco;

    this.quantidade = quantidade;

    this.data = data;

    }

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

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    28/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

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

    Selecione os getters e depois Finish:

    ) Verique sua classe. Ela deve estar assim:

    public final class Negociacao {

    private final double preco;

    private final int quantidade;

    private final Calendar data;

    public Negociacao(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() {

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

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    29/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    return data;

    }

    }

    ) 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 Negociacao devolver o volume de dinheiro transferido naquela negociao.Na prtica, s multiplicar o preco pago pela quantidade de aes negociadas, resultando no total dedinheiro que aquela negociao realizou.

    Adicione o mtodo getVolume na classe Negociacao:

    public double getVolume() {

    return preco * quantidade;

    }

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

    ) 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;

    private final double fechamento;

    private final double minimo;

    private final double maximo;

    private final double volume;

    private final Calendar data;

    }

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

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

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    30/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

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

    A classe nal deve car parecida com a que segue:

    public final class Candlestick {

    private final double abertura;

    private final double fechamento;private final double minimo;

    private final double maximo;

    private final double volume;

    private final Calendar data;

    public Candlestick(double abertura,double fechamento,double minimo,

    double maximo, double volume, Calendar data) {

    this.abertura = abertura;

    this.fechamento = fechamento;

    this.minimo = minimo;this.maximo = maximo;

    this.volume = volume;

    this.data = data;

    }

    public double getAbertura() {

    return abertura;

    }

    public double getFechamento() {

    return fechamento;}

    public double getMinimo() {

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

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    31/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    return minimo;

    }

    public double getMaximo() {return maximo;

    }

    public double getVolume() {

    return volume;

    }

    public Calendar getData() {

    return data;

    }

    }

    ) (opcional) Vamos adicionardois 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;

    }

    . R N

    Agora que temos as classes que representam negociaes na bolsa de valores (Negociacao) e resumos diriosdessas negociaes (Candlestick), falta apenas fazer a ao de resumir as negociaes de um dia em umacandle.

    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;

    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: quando va-mos criar a candle, a lista de negociaes j vem ordenada portempo. Dessa forma, a abertura e o fechamento

    Captulo - O modelo da bolsa de valores, datas e objetos imutveis - Resumo dirio das Negociaes - Pgina

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    32/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    so 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, precisamos

    passar por cada negociao da lista vericando se aquele valor menor do que todos os outros que j vi-mos, maior que nosso mximo atual. Aproveitando esse processo de passar por cada negociao, j vamossomando o volume de cada negociao.

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

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

    Ctrl + espao: autocompleta

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

    E

    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 uma negociao deveria saber resumir vrios de si emuma candle? Ou ser que uma Candlestick deveria saber gerar um objeto do prprio tipo Candlestick apartir de uma lista de negociaes.

    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 um

    pouco mais complexa, isto , apenas aplica boas prticas de orientao a objetos que voc j vem estudandodesde o FJ-.

    . E: C

    ) Como o resumo de Negociacoes 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 CandlestickFactory

    dentro do pacote br.com.caelum.argentum.modelo:

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

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    33/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

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

    public class CandlestickFactory {

    // ctrl + 1 para adicionar o return automaticamente

    public Candlestick constroiCandleParaData(Calendar data,

    List negociacoes) {

    }

    }

    ) Calcularemos o preo mximo e mnimo percorrendo todas as negociaes e achando os valores corre-tos. Para isso, usaremos variveis temporrias e, dentro do for, vericaremos se o preo da negociaoatual bate ou mximo. Se no bater, veremos se ele menor que o mnimo. Calculamos o volume so-mando o volume de cada negociao em uma varivel. Podemos pegar o preo de abertura atravs denegociacoes.get(0) e o de fechamento por negociacoes.get(negociacoes.size() - 1).

    public class CandlestickFactory {

    public Candlestick constroiCandleParaData(Calendar data,

    List negociacoes) {

    double maximo = negociacoes.get(0).getPreco();double minimo = negociacoes.get(0).getPreco();

    double volume = 0;

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

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    34/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    // digite foreach e d um ctrl + espao para ajudar a

    // criar o bloco abaixo!for (Negociacao negociacao : negociacoes) {

    volume += negociacao.getVolume();

    if (negociacao.getPreco() > maximo) {

    maximo = negociacao.getPreco();

    } else if (negociacao.getPreco() < minimo) {

    minimo = negociacao.getPreco();

    }

    }

    double abertura = negociacoes.get(0).getPreco();

    double fechamento = negociacoes.get(negociacoes.size()-1).getPreco();

    return new Candlestick(abertura, fechamento, minimo, maximo,

    volume, data);

    }

    }

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

    public class TestaCandlestickFactory {

    public static void main(String[] args) {

    Calendar hoje = Calendar.getInstance();

    Negociacao negociacao1 = new Negociacao(40.5, 100, hoje);

    Negociacao negociacao2 = new Negociacao(45.0, 100, hoje);

    Negociacao negociacao3 = new Negociacao(39.8, 100, hoje);

    Negociacao negociacao4 = new Negociacao(42.3, 100, hoje);

    List negociacoes = Arrays.asList(negociacao1, negociacao2,

    negociacao3, negociacao4);

    CandlestickFactory fabrica = new CandlestickFactory();

    Candlestick candle = fabrica.constroiCandleParaData(

    hoje, negociacoes);

    System.out.println(candle.getAbertura());

    System.out.println(candle.getFechamento());

    System.out.println(candle.getMinimo());System.out.println(candle.getMaximo());

    System.out.println(candle.getVolume());

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

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    35/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    }

    }

    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 autoboxingde arrays.

    E J

    Item : Conhea e use as bibliotecas!

    A sada deve ser parecida com:

    40.5

    42.3

    39.8

    45.0

    16760.0

    . E

    )E J

    Item : 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 entero esqueleto da reescrita ser montado.

    ) Um double segue uma regrabem denida em relao a contas e arredondamento, e para ser rpido e caberem 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.

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

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    36/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    ) O construtor da classe Candlestick simplesmente muito 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.

    E J

    Item : 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;

    return this;

    }

    // outros 5 setters que retornam this

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

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    37/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    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.

    U F I DSL

    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.

    So muito usadas (e recomendadas) na construo de DSLs, Domain Specic Languages. MartinFowler fala bastante sobre uent interfaces nesse timo artigo:

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

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

    http://martinfowler.com/bliki/FluentInterface.htmlhttp://martinfowler.com/bliki/FluentInterface.html
  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    38/189

    C

    Testes Automatizados

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

    Albert Einstein

    . N

    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 tem muitas falhas. Olhemos com mais cuidado.

    . E:

    ) Ser que nosso programa funciona para um determinado dia que ocorrer apenas uma nica negociao?Vamos escrever o teste, e ver o que acontece:

    public class TestaCandlestickFactoryComUmaNegociacaoApenas {

    public static void main(String[] args) {

    Calendar hoje = Calendar.getInstance();

    Negociacao negociacao1 = new Negociacao(40.5, 100, hoje);

    List negociacoes = Arrays.asList(negociacao1);

    CandlestickFactory fabrica = new CandlestickFactory();

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    39/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    Candlestick candle = fabrica.constroiCandleParaData(hoje, negociacoes);

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

    System.out.println(candle.getMinimo());

    System.out.println(candle.getMaximo());

    System.out.println(candle.getVolume());

    }

    }

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

    ) Mais um teste: as aes menos negociadas podem car dias sem nenhuma operao acontecer. O que

    nosso sistema gera nesse caso?

    Vamos ao teste:

    public class TestaCandlestickFactorySemNegociacoes {

    public static void main(String[] args) {

    Calendar hoje = Calendar.getInstance();

    List negociacoes = Arrays.asList();

    CandlestickFactory fabrica = new CandlestickFactory();

    Candlestick candle = fabrica.constroiCandleParaData(hoje, negociacoes);

    System.out.println(candle.getAbertura());

    System.out.println(candle.getFechamento());

    System.out.println(candle.getMinimo());

    System.out.println(candle.getMaximo());

    System.out.println(candle.getVolume());

    }

    }

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

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

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

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    40/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services 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 sempre

    a 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 negociacoes.isEmpty(), porm podemos tentaralgo mais 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 valor

    bem 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 negociacoes est vazia na hora de calcular o preo de abertura efechamento. Altere novamente o mtodo:

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

    double fechamento = negociacoes.isEmpty() ? 0 :

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

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

    ) 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 uma negociao retorna .E como valor mnimo agora! Masdeveria ser .. Ainda bem que lembramos de rodar essa classe, e que percebemos que esse nmero estdiferente do que deveria ser.

    Vamos sempre conar em nossa memria?

    ) (opcional) Ser que esse erro est ligado a ter apenas uma negociao? Vamos tentar com mais negocia-es? Crie e rode um teste com as seguintes negociaes:

    Negociacao negociacao1 = new Negociacao(40.5, 100, hoje);

    Negociacao negociacao2 = new Negociacao(45.0, 100, hoje);

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

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    41/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    Negociacao negociacao3 = new Negociacao(49.8, 100, hoje);

    Negociacao negociacao4 = new Negociacao(53.3, 100, hoje);

    E com uma sequncia decrescente, funciona? Por qu?

    . D

    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.

    ) Uma negociao da Petrobras a reais, com uma quantidade negativa de negociaes vlida? E comnmero zero de negociaes?

    Em outras palavras, posso dar new em uma Negociacao com esses dados?

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

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

    ) 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?) Como geramos um candle de um dia que no houve negociao? O que acontece?

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

    ) E se essas Negociaes forem de dias diferentes que a data passada como argumento para a factory?

    . T U

    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.

    U

    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 - Testes Automatizados - Denindo melhor o sistema e descobrindo mais bugs - Pgina

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    42/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services 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 classe

    modicou 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.

    A

    Muitas vezes, principalmente quandoestamos iniciandono mundo dos testes, comum criarmosalguns testes que testam muito mais do que o necessrio, mais do que apenas a unidade. Tais

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

    . JU

    O JUnit (junit.org) um framework muito simples para facilitar a criao destes testes de unidade e em

    especial 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 voc mexe no seu cdigo, voc roda novamente toda aquela bateria de testes com um 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.

    U JU - C JAR E

    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 - Testes Automatizados - JUnit - Pgina

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    43/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    aquiqueo Classpath 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:

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

    ) Escolha a opo Properties.

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

    E, nessa tela:

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

    ) 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.

    . A

    Anotao a maneira de escrever metadados na prpria classe, isto , conguraes ou outras informaespertinentes a essa classe. Esse recurso foi introduzido no Java .. 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 - Testes Automatizados - Anotaes - Pgina

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    44/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    @Deprecated indica que um mtodo no deve ser mais utilizado por algum motivo 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 o warning 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 , mas realmente ainda maisutilizada em frameworks, como o Hibernate , o EJB e o JUnit.

    . JU, 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 SourceFolderde testes (src/test/java).

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

    package br.com.caelum.argentum.modelo;

    public class CandlestickFactoryTest {

    public void sequenciaSimplesDeNegociacoes() {

    Calendar hoje = Calendar.getInstance();

    Negociacao negociacao1 = new Negociacao(40.5, 100, hoje);

    Negociacao negociacao2 = new Negociacao(45.0, 100, hoje);

    Negociacao negociacao3 = new Negociacao(39.8, 100, hoje);

    Negociacao negociacao4 = new Negociacao(42.3, 100, hoje);

    List negociacoes = Arrays.asList(negociacao1, negociacao2,negociacao3, negociacao4);

    CandlestickFactory fabrica = new CandlestickFactory();

    Candlestick candle = fabrica.constroiCandleParaData(hoje, negociacoes);

    }

    }

    Emvezdeummain, criamos um mtodo com nome expressivo para descrever a situaoqueeleesttestando.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 - Testes Automatizados - JUnit, convenes e anotao - Pgina

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    45/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    public class CandlestickFactoryTest {

    @Testpublic void sequenciaSimplesDeNegociacoes() {

    // ...

    }

    }

    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 .:

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

    Oprimeiroargumentooquechamamosde 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

    D

    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 so muito 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:

    public class CandlestickFactoryTest {

    @Test

    public void sequenciaSimplesDeNegociacoes() {

    Calendar hoje = Calendar.getInstance();

    Negociacao negociacao1 = new Negociacao(40.5, 100, hoje);

    Captulo - Testes Automatizados - JUnit, convenes e anotao - Pgina

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    46/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

    Negociacao negociacao2 = new Negociacao(45.0, 100, hoje);

    Negociacao negociacao3 = new Negociacao(39.8, 100, hoje);

    Negociacao negociacao4 = new Negociacao(42.3, 100, hoje);

    List negociacoes = Arrays.asList(negociacao1, negociacao2,

    negociacao3, negociacao4);

    CandlestickFactory fabrica = new CandlestickFactory();

    Candlestick candle = fabrica.constroiCandleParaData(hoje, negociacoes);

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

    Assert.assertEquals(42.3, candle.getFechamento(), 0.00001);

    Assert.assertEquals(39.8, candle.getMinimo(), 0.00001);Assert.assertEquals(45.0, candle.getMaximo(), 0.00001);

    Assert.assertEquals(1676.0, candle.getVolume(), 0.00001);

    }

    }

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

    . E: JU

    ) considerada boa prtica separar as classes de testes das classes principais. Para isso, normalmente secria um novo source folderapenas 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 - Testes Automatizados - Exerccios: migrando os testes do main para JUnit - Pgina

  • 7/15/2019 caelum-java-testes-jsf-web-services-design-patterns-fj22.pdf

    47/189

    Material do Treinamento Laboratrio Java com Testes, JSF, Web Services e Design Patterns

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

    ) Vamos criar um novo unit testem cima da classe CandlestickFactory. O Eclipse j ajuda bastante: como editor na CandlestickFactory, crie um novo (ctrl + N) JUnit Tes